负值左移0个位置?

jww*_*jww 8 c bit-shift

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

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

(我很好奇的细节是一个0大小的班次,在练习中根本没有任何转变.所以我想知道语言是否含糊不清,这样可以允许0左右的左移).

Ded*_*tor 7

摘录自C99,包括技术勘误TC1,TC2和TC3:

6.5.7按位移位运算符

[...]

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

所以,总是未定义.