使用負數計數或超出型別寬度的位移位
如果換檔計數值為負值,則左移和右移操作均未定義 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 節:
如果右運算元的值為負或大於或等於提升的左運算元的寬度,則行為未定義。