负值左移0个位置?

时间:2014-04-05 16:48:27

标签: c bit-shift

在C中,负值的左移是未定义的行为。我遇到了两个用英特尔ICC编译的库,其中删除了有问题的代码。在Clang,Comeau,GCC和MSVC下,相同的代码也没问题。

标准是否提及左移0位的负值?它还未定义吗?

(我很好奇的细节是一个0大小的班次,在练习中完全没有任何转变。所以我想知道这种语言是否模糊,以至于0左右的班次可能被允许)。

1 个答案:

答案 0 :(得分:7)

摘自C99 with Technical corrigenda TC1, TC2, and TC3 included

  

6.5.7按位移位运算符

[...]

  

对每个操作数执行整数提升。结果的类型是   升级的左操作数。如果右操作数的值为负或是   大于或等于提升左操作数的宽度,行为未定义   E1<<<< E2是E1左移E2位位置;腾出的位充满了   零。如果E1具有无符号类型,则结果的值为E1×2 E2 ,减少模数   比结果类型中可表示的最大值多一个。 如果E1已签名   类型和非负值,E1×2 E2 在结果类型中可表示,那么   结果价值;否则,行为未定义。

所以,总是未定义。