首頁 >後端開發 >C++ >為什麼 GCC 在移位計數過多的右移位操作中會產生未定義的行為?

為什麼 GCC 在移位計數過多的右移位操作中會產生未定義的行為?

DDD
DDD原創
2024-11-02 09:21:02154瀏覽

Why Does GCC Produce Undefined Behavior in Right Shift Operations with Excessive Shift Counts?

移位計數過多的右移操作中的未定義行為

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn