C++03标准告诉我们,对有符号类型应用位移操作符的结果可能是未定义行为或仅在负值情况下实现定义。我的问题是:为什么对于运算符“<<”,它具有未定义行为,而对于运算符“>>”,它只是实现定义?是否有严格的原因使得“<<”的结果也不能是实现定义?谢谢。
根据5.8/2(虽然我只能使用C++ 98):E1 << E2的值是将E1(解释为位模式)左移E2个位置;空出的位填充为零。如果E1具有无符号类型,则结果的值为E1乘以2的E2次方,如果E1具有unsigned long类型,则对ULONG_MAX+1取模,否则对UINT_MAX+1取模。从这个描述来看,左移是完全定义好的。未定义的是有符号值(例如二进制补码)的表示形式,因此对于负值,结果的数值值是实现定义的。这与右移不同,在右移时,空出的位可能是零或一,具体取决于有符号值的表示形式。