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

这就是我理解后的复述.欢迎大家一起讨论