使用左移运算符在C编程中左移-1
时的数字结果是什么?
例如:
23 << -1
答案 0 :(得分:9)
来自C11标准6.5.7p3(对于以前的版本它基本相同):
“如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。”
IOW:undefined behaviour。准备nasal demons。
简要说明:不要
警告:虽然许多程序员都意识到这一点并避免了负移位计数,但通常会忽略它,同时计算>=
值的位大小也是未定义的。如果((unsigned int)1 << 32) - 1
具有32位或更少,则会使unsigned int
之类的内容实际上未定义。对于签名值,由于符号,事情变为more complicated(感谢@chux指向我)。这是一个常见的陷阱。对于某些实现,可能会出现常量表达式(编译时评估)和运行时评估的不同结果。
答案 1 :(得分:1)
正如奥拉夫在他的回答中所说,左移一个负数是不明确的。
事实上,如果您尝试向任一方向移动负数,gcc将发出警告。
答案 2 :(得分:0)
C中的按位左移运算符
语法:
**[variable]<<[number of places]**
如果地方数量变为负数,则不会定义