将位移运算符应用于有符号类型:UB和Impl.定义

5
C++03标准告诉我们,对有符号类型应用位移操作符的结果可能是未定义行为或仅在负值情况下实现定义。我的问题是:为什么对于运算符“<<”,它具有未定义行为,而对于运算符“>>”,它只是实现定义?是否有严格的原因使得“<<”的结果也不能是实现定义?谢谢。
1个回答

3
根据5.8/2(虽然我只能使用C++ 98):
E1 << E2的值是将E1(解释为位模式)左移E2个位置;空出的位填充为零。如果E1具有无符号类型,则结果的值为E1乘以2的E2次方,如果E1具有unsigned long类型,则对ULONG_MAX+1取模,否则对UINT_MAX+1取模。
从这个描述来看,左移是完全定义好的。未定义的是有符号值(例如二进制补码)的表示形式,因此对于负值,结果的数值是实现定义的。
这与右移不同,在右移时,空出的位可能是零或一,具体取决于有符号值的表示形式。

是的,看起来我误解了这个问题,并认为它仅适用于没有带符号类型和负值的情况。 - Grigor Gevorgyan
啊,现在明白了,在 C 语言中它是未定义的,我不小心看了一下 ISO C99(6.5.7/4):) 感谢解释。 - Grigor Gevorgyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接