在C中,负值的左移是未定义的行为。我遇到了两个用英特尔ICC编译的库,其中删除了有问题的代码。在Clang,Comeau,GCC和MSVC下,相同的代码也没问题。
标准是否提及左移0位的负值?它还未定义吗?
(我很好奇的细节是一个0大小的班次,在练习中完全没有任何转变。所以我想知道这种语言是否模糊,以至于0左右的班次可能被允许)。
答案 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 在结果类型中可表示,那么 结果价值;否则,行为未定义。
所以,总是未定义。