main( )
{ unsigned a=32768;
   printf(“a=%d\n”,a); }

答案是 a=-32768。

首先,unsigned是表示一個變量(或常數)是無符號類型。signed表示有符號。

unsigned & signed I

? 無符號數的數值范圍0-65535,有符號數的數值范圍在-32768- +32767之間.所以有符號運算比無符號運算耗資源.

無符號數32768的二進制形式為1000 0000 0000 0000.

ƒ 在轉換為有符號數時,由于最高位表示符號數,因此可以理解其為一個負數。負數采用2的補碼(two's complement)表示。“要把內存中以補碼形式存放的二進制碼轉換成十進制的負數步驟如下:
  1.先對各位取反
  2.將所得的二進制數轉換成十進制數
  3.因為最高位為1,因此在所得的十進制數前面加負號.
  4.對所求得的數再減1,即可.

按照上面的步驟:各位先取反,0111 1111 1111 1111 ;再轉為十進制數,32767;再在所得的數前加負號,-32767;再減1,即為-32767-1=-32768.。


unsigned & signed Ⅱ

main()
{ int  b=-2;
  printf(“b=%u”,b); }
答案是b=65534。

其具體步驟為:

 Œ先取-2的絕對值2的原碼:0000 0000 0000 0010 
 ?將其轉換為反碼:1111 1111 1111 1101 
 ?加1補碼:1111 1111 1111 1110

十進制形式就是無符號數 65534

這就是我理解后的復述.歡迎大家一起討論