C11§6.5.7第5段:是「-1 >> 5;」 C中未指定的行爲?
的
E1 >> E2
結果是E1
右移E2
比特位置。如果E1
具有無符號類型或者如果E1
具有帶符號類型和 非負值,則結果的值是E1/2*^E2
的商的整數部分。 如果E1
具有簽名類型和負值 值,則結果值是實現定義的。
但是,該viva64參考文件說:
int B; B = -1 >> 5; // unspecified behavior
我跑GCC此代碼,它總是給輸出-1
。
所以,標準說的是「如果E1有簽署類型和負值,所得到的值是實現定義的」,但該文件說的是-1>>5;
是不確定的行爲。
那麼,在C中是-1>>5;
未指定的行爲?哪個是對的?
如果您正在嘗試編寫可移植代碼,那麼實現定義和未指定之間的區別不是很重要,因此代碼檢查器會以類似方式處理它們。 – Barmar
它是實現定義的。 – chux
@chux那麼,那個文件是不正確的? – rsp