C語言中有符號數與無符號數相加
阿新 • • 發佈:2019-02-09
執行以下這段程式,輸出的結果是什麼?
#include <stdio.h>
int main()
{unsigned int a = 1;
signed int b = -2;
printf("%d\n", a + b);
printf("%u\n", a + b);
return 0;
}
計算機中的加法運算是通過加數補碼相加實現的。
程式中,a為無符號整型數,其補碼為0000 0001(方便起見,這裡僅用8位表示,下文同理),起始位的“0”表示數值;b為有符號整型數,其補碼為1111 1110,起始位的“1”表示正負。
將變數a和變數b的補碼相加,得到1111 1111。
printf("%d\n", a + b)中,由於%d的作用,使a+b以有符號十進位制的形式輸出,此時,最高位的1為符號位,減一取反得到其原碼,得到1000 0001,即十進位制的-1;
printf("%u\n", a + b)中,由於%u的作用,使a+b以無符號十進位制的形式輸出,此時,最高位的1並非符號位,其表示數值大小,不用減一取反,得到1111 1111,實際Linux系統中,該數用4個位元組表示,也就是說實際上這裡有16個"1",即十進位制數的4294967295(=2^32-1)。
綜上,該段程式的輸出結果為:
-1
4294967295