unsigned int a=10; unsigned int b=20;
此時按照一般想法,a-b應該等於-10,但是當打印出來發現,結果卻是4294967286
這時問題出在unsigned int上。
在我的機器上,unsigned int是32位的。
我們都知道,在計算機中,數字是按補碼存儲在存儲器中,而且使用補碼進行加減乘除等各種運算,unsigned int可以解釋為正數
a的補碼為:00000000000000000000000000001010
b的補碼為:00000000000000000000000000010100
兩個數相減,在硬件中是[x]補+[-y]補 我們知道[-y]補為y的補碼每一位取反加以
所以-b的補碼為:11111111111111111111111111101100
運算的結果是11111111111111111111111111110110,正數的補碼和原碼相同,所以對應的十進制數為4294967286
但是當兩個a b的數據類型為有符號整數時
int a=10; int b=20;
還是進行上述操作,得到11111111111111111111111111110110,但是這個數是結果的補碼,而該數是有符號數,因為最高位為1,所以按照負數的補碼到原碼的計算方法,符號位不變,其他位取反加1
所以計算結果的原碼是10000000000000000000000000001010,所以此時計算的結果為-10。
當一個數為unsigned int另一個為int時
unsigned int a = 10; int b = 20; cout <<"a-b="<< a-b << endl;
此時打印出來的結果為a-b=4294967286。
但是當上述代碼進行如下修改
unsigned int a = 10; int b = 20, sum = 0; sum = a - b; cout <<"a-b="<< sum << endl;
此時打印出來的結果為a-b=-10
隱式類型轉換
1. 算數運算式中,低類型被隱式的轉化為高類型
2. 賦值表達式中,右邊表達式的值隱式轉化為左邊的值