C ++ 03标准告诉我们将按位移位运算符应用于有符号类型的结果可以是UB和Impl。为否定值定义。我的问题如下:为什么运营商<<
有未定义的行为,而对于运营商>>
,它只是实施定义?是否有一个严格的理由说明为什么<<
的结果也无法实现?
提前谢谢。
答案 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否则。
从这一点来看,它看起来像是左移的完美定义。未定义的是使用的有符号值(例如二进制补码)的表示,因此结果的数值值是针对负值定义的实现。
这与右移相反,其中空位可能为零或一个填充,具体取决于有符号值的表示。