使用负数计数或超出类型宽度的位移位
如果换档计数值为负值,则左移和右移操作均未定义 1 :
int x = 5 << -3; /* undefined */
int x = 5 >> -3; /* undefined */
如果对负值执行左移,则未定义: ****
int x = -5 << 3; /* undefined */
如果对正值执行左移并且数学值的结果在类型中无法表示,则它未定义 1 : **** ****
/* Assuming an int is 32-bits wide, the value '5 * 2^72' doesn't fit
* in an int. So, this is undefined. */
int x = 5 << 72;
需要注意的是右移一个负值 (.eg -5 >> 3
)是不是不确定的,但实现定义。
1 引用 ISO / IEC 9899:201x ,第 6.5.7 节:
如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。