一、規(guī)則總結(jié)
1. 在c++中,如果賦值給無符號(hào)類型一個(gè)超過它表示范圍的值(如負(fù)數(shù)),結(jié)果是初始值對(duì)無符號(hào)類型表示數(shù)值最大值取模后的余數(shù)。
2. 在c++中,如果表達(dá)式中同時(shí)有無符號(hào)類型和有符號(hào)類型,會(huì)默認(rèn)將有符號(hào)類型轉(zhuǎn)換為無符號(hào)類型進(jìn)行運(yùn)算,運(yùn)算結(jié)果也是無符號(hào)類型。
二、以int和unsigned為例
1. 如果賦值給unsigned一個(gè)負(fù)數(shù)值,結(jié)果是什么?結(jié)果是將該負(fù)數(shù)對(duì)unsigned表示數(shù)最大值取模后的余數(shù)。
(1)unsigned表示數(shù)最大值
在大部分編譯器中該類型占4個(gè)字節(jié),則最大值是2的32次方,為4294967296。
(2)負(fù)數(shù)的取模運(yùn)算
負(fù)數(shù)的取模運(yùn)算和數(shù)學(xué)中的取余運(yùn)算不同,區(qū)別主要體現(xiàn)在:取模運(yùn)算是向負(fù)的無窮大取值,而取余運(yùn)算是向0取值。舉例說明:如-3對(duì)2取余結(jié)果為-1,但-3對(duì)2取模結(jié)果則是-2。
(3)賦值給unsigned一個(gè)負(fù)數(shù)值時(shí)實(shí)際得到的結(jié)果
上述程序的輸出結(jié)果是:
結(jié)果是怎么算出來的呢?
u=-1,-1對(duì)4294967296取模,結(jié)果還是-1,而取模后的余數(shù)是4294967296-(-1*-1)=4294967295
u=-20,-20對(duì)4294967296取模,結(jié)果是-20,取模后的余數(shù)是4294967296-20=4294967276
u=-4294967296(這是unsigned能表示的負(fù)數(shù)的極限),結(jié)果是-1(除不盡的需要向負(fù)無窮取值,能除盡就不用了),取模后的余數(shù)是4294967296-4294967296=0
2. 如果表達(dá)式中同時(shí)有unsigned和int,計(jì)算結(jié)果是什么?結(jié)果是將int轉(zhuǎn)換為unsigned后再計(jì)算,結(jié)果也按照unsigned來轉(zhuǎn)換
上述程序的輸出結(jié)果為:
結(jié)果是怎么算出來的呢?
u1-u2=10-42=-32,u1和u2都是unsigned,結(jié)果也應(yīng)是unsigned,-32超過了unsigned的表示范圍,需要轉(zhuǎn)換。按照上一小節(jié)中的轉(zhuǎn)換方式,轉(zhuǎn)換結(jié)果為4294967264
i1-u1=11-10=1,結(jié)果為unsigned的1。
u1-i1=10-11=-1,u1是無符號(hào)數(shù),i1首先轉(zhuǎn)換為無符號(hào)數(shù)為11,計(jì)算結(jié)果為-1,超出了unsigned范圍,轉(zhuǎn)換后為4294967295。
i=-1,轉(zhuǎn)換為unsigned后4294967295,所以i-u=4294967295-10=4294967285
三、結(jié)論
切勿混用帶符號(hào)類型和無符號(hào)類型!!!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注