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

Applying bitwise shift operators to signed types: UB and Impl. defined

本文关键字:UB Impl 定义 类型 运算符 应用于 符号      更新时间:2023-10-16

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

根据5.8/2(无可否认,在C++98中,这是我所能访问的):

E1<lt;E2为E1(解释为位模式)左移位的E2位位置;腾空的位被零填充。如果E1有无符号类型,结果的值是E1乘以数量2提升到E2的幂,降低模ULONG_MAX+1,如果E1的类型为unsigned否则为UINT_MAX+1。

从这一点来看,在我看来,它完全适合左移。没有定义的是所使用的有符号值的表示(如twos补码),因此结果的数字是为负值定义的实现。

这与右移形成对比,其中根据有符号值的表示,空出的比特可以是零或一填充。