C 中有符號整數溢位仍是未定義行為嗎?
根據 C 11 標準中的定義,有符號整數溢位仍然是未定義行為。儘管 cstdint 文件指出 int8_t、int16_t、int32_t 和 int64_t 類型對負值使用 2 的補碼,但溢位行為仍然被視為未定義。
C 11 標準第5/4 段強調指出:
**如果在表達式求值過程中,結果未在數學上定義或不在其類型的
可表示值的範圍,行為是未定義的。 **
因此,即使這些有符號類型採用了二進制補碼表示,算術模 2^n 也不會在
相反,C 11 標準在第 3.9.1/4段中明確規定無符號算術遵循模數算術:
無符號整數,聲明為無符號,應遵循算術模 2^n 法則,其中 n是特定大小整數的值表示中的
位數
因此,無符號算術運算總是在數學上可以定義的,並且結果值在可表示的範圍內,從而免除它未定義的行為條款。註腳46 進一步澄清了這一點:
這意味著無符號算術不會溢出,因為無法由結果
無符號整數類型表示的結果會以1 為模進行減少大於
結果無符號整數類型可以表示的最大值。
總而言之,當使用有符號類型的2 的補碼表示為負值提供了明確定義的行為,這些類型的整數溢出在C 中仍然是未定義的行為,因為標準覆蓋了任何依賴於實現的行為。
以上是C 中的有符號整數溢位仍然是未定義的行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!