計數超出類型寬度時右移的未定義行為
在C 中,右移運算子(>>) 的行為在標準中定義,特別是在第5.8 節「移位運算子」。問題是,大於或等於左操作數類型寬度的移位計數是否為未定義行為。
C 標準規定 E1 的值>>> E2 是 E1/2^E2 的商的整數部分,其中 E1 是左操作數,E2 是右操作數。這表示僅當 E1 具有無符號類型或具有非負值的有符號類型且 E2 為非負時才定義該行為。
但是,問題考慮了 E1 為無符號類型的情況int 和 E2 為 34,超出了無符號 int 的 32 位元寬度。標準明確指出這種情況下的行為是未定義的。
因此,儘管 C 標準中關於商計算的聲明,但右移計數大於 32 的無符號 int 的行為是未定義的。這就是 GCC 在執行此類轉變時發出警告的原因。
以上是右移計數超出其類型寬度的無符號整數 C 中的未定義行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!