C語言中unsigned int加減的問題


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. 賦值表達式中,右邊表達式的值隱式轉化為左邊的值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM