3 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
歷史原因是,大多數(shù)C實(shí)現(xiàn)(編譯器)只使用它使用的整數(shù)表示最容易實(shí)現(xiàn)的溢出行為。C實(shí)現(xiàn)通常使用CPU使用的相同的表示形式,因此溢出行為與CPU使用的整數(shù)表示相同。
在實(shí)踐中,只有符號(hào)值的表示才可能因?qū)崿F(xiàn)而不同:一個(gè)是補(bǔ)語(yǔ),兩個(gè)是補(bǔ)語(yǔ),另一個(gè)是符號(hào)大小。對(duì)于無(wú)符號(hào)類型,標(biāo)準(zhǔn)沒有理由允許更改,因?yàn)橹挥幸粋€(gè)明顯的二進(jìn)制表示(標(biāo)準(zhǔn)只允許二進(jìn)制表示)。
相關(guān)引文:
C99 6.2.6.1:3:
存儲(chǔ)在無(wú)符號(hào)位字段和類型為無(wú)符號(hào)字符的對(duì)象中的值應(yīng)使用純二進(jìn)制表示法表示。
C99 6.2.6.2:2:
如果符號(hào)位為1,則應(yīng)以下列方式之一修改該值:
-符號(hào)位0的相應(yīng)值被否定(符號(hào)和震級(jí));
-符號(hào)位的值為?(2)N) (二補(bǔ));
-符號(hào)位的值為?(2)N?1)(補(bǔ)足).
現(xiàn)在,所有處理器都使用兩種補(bǔ)碼表示,但簽名算術(shù)溢出仍未定義,編譯器制造商希望它保持未定義,因?yàn)樗鼈兝眠@種不確定性來(lái)幫助優(yōu)化。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
C11 6.5/5
如果在計(jì)算表達(dá)式過(guò)程中出現(xiàn)異常情況(即,如果結(jié)果沒有數(shù)學(xué)定義,或者不在其類型的可表示值范圍內(nèi)),則行為是未定義的。
C11 6.2.5/9
有符號(hào)整數(shù)類型的非負(fù)值范圍是對(duì)應(yīng)的無(wú)符號(hào)整數(shù)類型的子范圍,每個(gè)類型中相同值的表示形式是相同的。涉及無(wú)符號(hào)操作數(shù)的計(jì)算永遠(yuǎn)不會(huì)溢出,因?yàn)椴荒苡媒Y(jié)果無(wú)符號(hào)整數(shù)類型表示的結(jié)果將被減少,即大于結(jié)果類型所能表示的最大值的數(shù)字。
C11 6.3.1.3
6.3.1.3有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)
當(dāng)具有整數(shù)類型的值轉(zhuǎn)換為_bool以外的另一個(gè)整數(shù)類型時(shí),如果該值可以由新類型表示,則它將保持不變。
否則,如果新類型沒有符號(hào),則通過(guò)重復(fù)添加或減去比新類型中可以表示的最大值多一個(gè)值來(lái)轉(zhuǎn)換值,直到該值位于新類型的范圍內(nèi)為止。
否則,將對(duì)新類型進(jìn)行簽名,并且不能在其中表示值;結(jié)果要么是實(shí)現(xiàn)定義的,要么引發(fā)實(shí)現(xiàn)定義的信號(hào)。
- 3 回答
- 0 關(guān)注
- 1312 瀏覽
添加回答
舉報(bào)