天天看點

c語言的帶符号擴充和無符号擴充

始終記住兩條:

1. 有符号的資料類型,在向高精度擴充時,總是帶符号擴充

2. 無符号的資料類型,在向高精度擴充時,總是無符号擴充

char   ca=128;

unsigned  char  ucb=128;

unsigned  short   usc=0;

usc=ca + ucb; 

	printf("%x",usc);

usc=ca +(unsigned  short)ucb; 

	printf("%x",usc);

usc=(unsignedchar)ca + ucb;

	printf("%x",usc);

usc=ca+(char)ucb;

	printf("%x",usc);
           

那麼上面的四種情況分别輸出什麼呢?

分析:

1)對于char類型,有符号,128已經溢出了,其二進制是 1000 0000,第一位會被當成符号位,

也是就是說此時它是負數了,它擴充成unsigned short時,帶符号位擴充,符号位為1,是以在

前方補1,結果是 1111 1111 1000 000。 ucb類型為nsigned char,無符号,二進制是1000 0000,

擴充成unsigned shor,無符号擴充,是以補0,結果是0000 0000 1000 0000,。相加結果為 

1 0000 0000 0000 0000 由于unsigned short是二位元組,舍棄最前面的1,是以得到0x0,

2)情況和1一樣,隻是将ucb顯示強制轉換為unsigned short,是以得到0x0,

3)ca先強制轉換為unsignedchar,仍然是1000 0000,注意此時轉換後已經是一個無符号數,

是以再往unsigned  short 擴充時,為無符号擴充,結果為0000 0000 1000 0000,ucb擴充後

也是0000 0000 1000 0000,相加結果為 0000 0001 0000 0000,是以結果為0x100

4)ca轉為unsigned short,帶符号擴充,為1111 1111 1000 000,ucb先強制轉換為char,

然後再轉為unsigned short,此時也要帶符号擴充,是以也是1111 1111 1000 000,兩數相加,

得到 1 1111 1111 0000 0000 ,是以結果為0xff00