3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
盡管大多數(shù)現(xiàn)代CPU使用2的補(bǔ)碼,并且整數(shù)溢出會(huì)導(dǎo)致可預(yù)測的模數(shù)環(huán)繞,但這絕不是通用的-為了使該語言具有足夠的通用性,使其可以在最廣泛的體系結(jié)構(gòu)上使用,最好將整數(shù)溢出指定為UB 。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
盡管將簽名溢出指定為未定義行為的歷史原因可能是這些虛假的遺留表示(補(bǔ)碼/符號(hào)幅度)和溢出中斷,但使其保持未定義行為的現(xiàn)代原因是優(yōu)化。正如J-16 SDiZ所暗示的那樣,帶符號(hào)的溢出是未定義的行為,這一事實(shí)使編譯器可以優(yōu)化某些條件,這些條件的代數(shù)真值(但不一定是表示層真值)已由先前的分支建立。它還可能允許編譯器以某種方式代數(shù)簡化某些表達(dá)式(尤其是涉及乘法或除法的表達(dá)式),如果子表達(dá)式包含溢出,則該表達(dá)式可能會(huì)給出與原始編寫的求值順序不同的結(jié)果,
為了允許優(yōu)化的目的,未定義行為的另一個(gè)巨大示例是別名規(guī)則。

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
undefined behavior規(guī)范中的位涉及一些編譯器優(yōu)化。例如:
if (a > 0 && b > 0) {
if ( a + b <= 0 ) {
// this branch may be optimized out by compiler
} else {
// this branch will always run
}
}
現(xiàn)代的C編譯器并不是那么簡單,它會(huì)進(jìn)行大量的猜測和優(yōu)化。
- 3 回答
- 0 關(guān)注
- 769 瀏覽
添加回答
舉報(bào)