亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有符號整數溢出是否仍然是C+中未定義的行為?

有符號整數溢出是否仍然是C+中未定義的行為?

C++
眼眸繁星 2019-07-17 16:36:35
有符號整數溢出是否仍然是C+中未定義的行為?我們知道,有符號整數溢出是未定義的行為。..但是在C+11中有一些有趣的東西cstdint文件:帶符號整數類型,寬度分別為8、16、32和64位,沒有填充位和對負值使用2的補碼(只有在實現直接支持類型時才提供)見鏈接這是我的問題:因為標準明確規定int8_t, int16_t, int32_t和int64_t負數是2的補碼,這些類型的溢出是否仍是一種未定義的行為?編輯我檢查了C+11和C11標準,下面是我發現的:C+11,第18.4.1節:標頭定義了與C標準中的7.20相同的所有函數、類型和宏。C11,第7.20.1.1節:類型胡枝子名稱intN_t指定帶符號整數類型,其寬度為N,沒有填充位,并指定兩個補碼表示形式。因此,int8_t表示這樣一個帶符號整數類型,寬度正好為8位。
查看完整描述

3 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

我敢打賭。

來自標準文件(第4和第5頁):

1.3.24未定義的行為

本國際標準不要求的行為

[注意:如果本國際標準遺漏了任何明確的行為定義,或者當程序使用錯誤的構造或錯誤的數據時,可能會出現未定義的行為。允許的未定義行為包括:完全忽略這種情況而導致不可預測的結果;在翻譯或程序執行過程中以具有環境特征的記錄方式(無論是否發布診斷消息);終止翻譯或執行(通過發布診斷消息)。許多錯誤的程序構造不會產生未定義的行為;它們需要被診斷。


查看完整回答
反對 回復 2019-07-17
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

這些類型的溢出是否仍然是未定義的行為?

是。根據C+11標準第5/4段(關于一般的表述):

如果在計算表達式時,結果沒有數學定義,或者不在其類型的可表示值范圍內,行為未定義. [...]

對那些符號類型使用兩個補碼表示的事實并不意味著在計算這些類型的表達式時使用算術模2^n。

有關未簽名另一方面,“標準”明確規定(第3.9.1/4段):

無符號整數,聲明unsigned應遵守算術模2^n定律其中n是該整數特定大小的值表示中的位數。

這意味著無符號算術運算的結果總是“數學定義“,結果總是在可代表的范圍內;因此,5/4不適用。腳注46解釋說:

46)這意味著未簽名算術不會溢出,因為不能用結果無符號整數類型表示的結果將被減少,即大于結果無符號整數類型所能表示的最大值的數字。


查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關注
  • 615 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號