在C语言中,当左侧操作数为负值时,按位左移位操作调用未定义的行为.
ISO C99相关报价(6.5.7/4)
E1<;<;E2的结果是E1左移E2位位置;空出的位是带零的fiLled.如果E1具有无符号类型,则结果值为E1×2E2,减go 模数 比结果类型中可表示的最大值大1.如果E1有签名的 类型和非负值,并且E1×2E2在结果类型中可表示,则即 结果值;否则为the behavior is undefined.
但是在C++中,行为是很好定义的.
ISO C++-03(5.8/2)
E1<;<;E2的值是E1(解释为位模式)左移E2位位置;空出的位是零填充的.如果E1为无符号类型,则结果值为E1乘以2的E2次幂,如果E1为无符号长整型,则模ULONG_MAX+1减go ,否则为UINT_MAX+1. [注:常量ULONG_MAX和UINT_MAX在标题中定义).]
这意味着
int a = -1, b=2, c;
c= a << b ;
调用C中的未定义行为,但行为在C++中定义良好.
是什么迫使ISO C++委员会考虑定义良好的行为,而不是C语言中的行为?
另一方面,当左操作数为负时,按位右移操作的行为是implementation defined
,对吗?
我的问题是,为什么左移操作调用C中未定义的行为,为什么右移运算符只调用实现定义的行为?
附注:请不要这样回答"这是未定义的行为,因为标准是这样说的".:p