在C 標準中,對於非負移位計數,右移操作的行為是明確定義的。但是,當移位計數超過要移位的類型的寬度時,該行為被視為未定義。
考慮以下程式碼:
<code class="cpp">unsigned int val = 0x0FFFFFFF; unsigned int res = val >> 34; // res should be 0 by C++ standard</code>
根據 C 標準,因為 34 是如果不是負數,則結果值 res 應該為 0。但是,GCC 會對此程式碼片段發出警告並產生非零結果。
GCC 在這種情況下的行為可以透過以下摘錄來解釋C 標準草案第 5.8 節移位運算符:
結果的類型是提升的左操作數的類型。 如果右邊操作數為負,或大於或等於提升的左操作數的位長度,則行為未定義。
在這種情況下,如果unsigned int 為 32 位元或更少,則 34 的移位計數超出了提升的左操作數的寬度。因此,該行為是未定義的,GCC 的警告是合理的。
需要注意的是,此上下文中的未定義行為並不指未定義的值。相反,它意味著行為是實現定義的,並且可能因不同的編譯器和平台而異。在這種情況下,GCC 在 Intel 平台上的行為不符合 C 標準的預期。
以上是為什麼 GCC 在移位計數過多的右移位操作中會產生未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!