int main()
{
int i=-20;
unsigned j=10;
cout<<i+j<<endl;
system("pause");
return 0;
}
輸出結果:4 294 967 286
2^32-10=4 294 967 296-10=4 294 967 286
兩個兼容的不同類型的操作,哪個能表示更大的數就轉為哪個類型。例如short+long,就要轉為long;unsigned+signed,就要轉為unsigned。
在32位機上
unsigned int 最大可表示2^32 - 1
int最大可表示2^31-1
這樣int就轉為了unsigned int,由於y<0,即y的最高位符號位是1,轉為unsigned int后最高為不再是符號位,而是一個最高位的正數,於是兩者相加就會是一個很大的正數了。
也許你會問為什么“哪個能表示更大的數就轉為哪個類型”?
因為計算機(注意,是計算機,不是編譯器,也不是操作系統)總是希望能盡量大的囊括結果,防止溢出產生錯誤(盡管有人會說向下溢出怎么辦,但別忘了,負數加減換成補碼也成了正數的加運算)。
int -20在32位計算機中的存儲形式為:1111 1111 1111 1111 1111 1111 1110 1100 第一位1為符號位,負
unsigned 10在32位計算機中的存儲形式為:0000 0000 0000 0000 0000 0000 0000 1010
unsigned+int 后結果轉為unsigned存儲,故int -20轉化為unsigned int,由於符號位為1,轉為unsigned int 后最高位不再是符號位,而是一個最高正的位數,兩者相加為
1111 1111 1111 1111 1111 1111 1111 0110 即為4 294 967 286。