左移数字的值是-1

Mit*_*nan 11 c operators shift

-1使用左移位算子在C编程中左移时,数字的结果是什么?

例如:

23 << -1
Run Code Online (Sandbox Code Playgroud)

too*_*ite 9

从C11标准6.5.7p3(对于以前的版本它基本相同):

"如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义."

IOW:未定义的行为.准备鼻子恶魔.

简而言之:不要

注意:虽然许多程序员都知道这一点并避免负移位计数,但通常会忽略它,也会计算值>=的位大小也是未定义的.((unsigned int)1 << 32) - 1如果unsigned int有32位或更少,这会使实际上未定义.对于签名值,由于符号,事情变得更加复杂(感谢@chux指向我).这是一个常见的陷阱.对于某些实现,可能会出现常量表达式(编译时评估)和运行时评估的不同结果.