使用负数计数或超出类型宽度的位移位

如果换档计数值为负值,左移右移操作均未定义 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 节:

如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。