左移数字的值是-1

时间:2015-07-21 19:37:06

标签: c operators shift

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

例如:

23 << -1

3 个答案:

答案 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中的按位左移运算符

  1. 数据的位模式可以按指定的位置数移动到左侧
  2. 当数据向左移动时,尾随零填充为零。
  3. 左移运算符是二元运算符[Bi - two]
  4. 二元意味着,需要两个参数的运算符!
  5. Table

    语法:

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

    如果地方数量变为负数,则不会定义