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