1. 程式人生 > >C語言中有符號數與無符號數相加

C語言中有符號數與無符號數相加

執行以下這段程式,輸出的結果是什麼?

#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