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

Gri*_*yan 5 c++ bit-shift

C++03 标准告诉我们,将按位移位运算符应用于有符号类型的结果可以是 UB 和 Impl。定义为负值。我的问题如下:为什么对于操作符<<它有未定义的行为,而对于操作符>>它只是实现定义的?是否有严格的原因导致结果<<也不能被实现定义?
提前致谢。

Mar*_*k B 4

根据 5.8/2(诚然,在 C++ 98 中,这是我可以访问的所有内容):

E1 << E2 的值是 E1(解释为位模式)左移 E2 位位置;空出的位用零填充。如果 E1 具有无符号类型,则结果值是 E1 乘以 2 的 E2 次方,如果 E1 具有 unsigned long 类型,则减少模 ULONG_MAX+1,否则为 UINT_MAX+1。

从这里看来,在我看来,它对于左移来说是完美定义的。未定义的是所使用的有符号值(例如二进制补码)的表示形式,因此结果的数值是为负值定义的实现。

这与右移相反,右移根据有符号值的表示,空出的位可能为零或被填充。