数字左移-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 中的按位左移运算符:
- 数据的位模式可以向左移动指定数量的位置
- 当数据左移时,尾随零用零填充。
- 左移运算符为二元运算符[bi-two]
- 二进制表示,需要两个参数的运算符!
语法:
**[variable]<<[number of places]**
如果 Number of Places 变为负数,则未定义
正如奥拉夫在他的回答中所说,左移负数是未定义的。
事实上,如果您尝试向任一方向移动负数,gcc 都会发出警告。
在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 中的按位左移运算符:
- 数据的位模式可以向左移动指定数量的位置
- 当数据左移时,尾随零用零填充。
- 左移运算符为二元运算符[bi-two]
- 二进制表示,需要两个参数的运算符!
语法:
**[variable]<<[number of places]**
如果 Number of Places 变为负数,则未定义
正如奥拉夫在他的回答中所说,左移负数是未定义的。
事实上,如果您尝试向任一方向移动负数,gcc 都会发出警告。