unsignedu=10;inti=-42;cout
類型轉(zhuǎn)換問題
寶慕林4294392
2019-04-21 20:19:50
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
cout<以32位機(jī)器為例,int能表示的最大值為2^32-1,最小值為-2^32。超過這個(gè)區(qū)間的int會溢出。這里,i=-42,顯然不會溢出。兩個(gè)int相加,結(jié)果還是int,所以得到-84是理所當(dāng)然。cout<這里是unsignedint和int相加,兩種不同的類型相加,編譯器會做隱式類型轉(zhuǎn)換。怎樣轉(zhuǎn)換?把有符號的轉(zhuǎn)為無符號的!所以,這行代碼相當(dāng)于:cout<關(guān)鍵問題是,怎樣把int轉(zhuǎn)為unsignedint?計(jì)算機(jī)用補(bǔ)碼表示負(fù)數(shù),以整形i=-42為例,它在32位計(jì)算機(jī)中的補(bǔ)碼表示為:11111111111111111111111111010110(如果按照16進(jìn)制,則表示為:FFFFFFD6)所謂某個(gè)變量是int還是unsignedint,在計(jì)算機(jī)看來都是一回事。關(guān)鍵在于編譯器怎樣“看待”這個(gè)變量。現(xiàn)在編譯器不把這個(gè)FFFFFFD6當(dāng)int看了,而是要把它當(dāng)unsignedint看待。于是,F(xiàn)FFFFFD6的含義就變成了:FFFFFFD6=2^31+2^30+...+2^7+2^6+2^4+2^2+2^1=4294967254也就是說,(int)-42與(unsignedint)4294967254其實(shí)是一回事,只不過編譯器對它們的解釋不同而已。結(jié)果已經(jīng)很明了:4294967254+10=4294967264,這就是你得到的輸出!
舉報(bào)