数字左移-1的值是多少

What is the value of number left shift by -1

在C程序中使用左移运算符将数字左移-1后的结果是什么?

例如:

23 << -1

来自C11标准6.5.7p3(以前的版本基本一样):

"If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined."

IOW:undefined behaviour. Prepare for nasal demons

简单地说:不要

警告:虽然许多程序员都知道这一点并避免负移位计数,但经常忽略的是 >= 值的位大小也是也未定义。如果 unsigned int 有 32 位或更少,这使得像 ((unsigned int)1 << 32) - 1 这样的东西实际上是未定义的。对于带符号的值,由于符号的原因,事情变成 more complicated (感谢@chux 指点我)。这是一个常见的陷阱。对于某些实现,常量表达式(编译时评估)和运行-时间评估可能会出现不同的结果。

C 中的按位左移运算符:

  1. 数据的位模式可以向左移动指定数量的位置
  2. 当数据左移时,尾随零用零填充。
  3. 左移运算符为二元运算符[bi-two]
  4. 二进制表示,需要两个参数的运算符!

语法:

**[variable]<<[number of places]**

如果 Number of Places 变为负数,则未定义

正如奥拉夫在他的回答中所说,左移负数是未定义的。

事实上,如果您尝试向任一方向移动负数,gcc 都会发出警告。