C 中有符號整數溢位的未定義行為
有符號整數溢位,當有符號整數的值超出其可表示範圍時發生,這是很好的- 已知在C 中是未定義的行為。然而,C 11 cstdint 文件引入了一個有趣的聲明:int8_t、int16_t、int32_t 和 int64_t 類型中的負值被明確指定為使用 2 的補碼表示。
此規範提出了一個問題:是否使用2 對這些類型中負值的補碼改變了未定義的行為狀態溢位?
不幸的是,答案仍然是是。根據 C 11 標準的第 18.4.1 節,頭檔定義的所有函數、型別和巨集與 C 標準的第 7.20 節相同。 C11 標準的第 7.20.1.1 節進一步闡明了 intN_t 作為具有 2 的補碼表示形式的有符號整數類型的定義。
儘管有2 的補碼表示形式的規範,C 11 標準在第5/4 節中明確指出,任何導致未定義數學結果或超出其類型可表示範圍的表達式將導致未定義
因此,負值使用2 的補碼並不表示這些類型的算術遵循模2^n 行為。然而,對於無符號整數,標準明確規定應用算術模 2^n 的法則,從而以數學方式定義溢出行為並使其處於可表示的範圍內。因此,無符號溢位不被視為未定義行為。
以上是2 的補碼表示法是否消除了 C 有符號整數溢位中的未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!