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

时间:2011-06-27 21:33:00

标签: c++ bit-shift

C ++ 03标准告诉我们将按位移位运算符应用于有符号类型的结果可以是UB和Impl。为否定值定义。我的问题如下:为什么运营商<<未定义的行为,而对于运营商>>,它只是实施定义?是否有一个严格的理由说明为什么<<的结果也无法实现? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

根据5.8 / 2(诚然在C ++ 98中,我可以访问):

  

E1的值<&lt; E2是E1   (解释为位模式)   左移E2位位置;腾空   位填零。如果E1有   unsigned type,结果的值   是E1乘以数量2   提升到E2的功率,减少模数   如果E1具有无符号类型,则ULONG_MAX + 1   long,UINT_MAX + 1否则。

从这一点来看,它看起来像是左移的完美定义。未定义的是使用的有符号值(例如二进制补码)的表示,因此结果的数值是针对负值定义的实现。

这与右移相反,其中空位可能为零或一个填充,具体取决于有符号值的表示。