在32位机中定义signed char a = 0xe0 ;
执行printf(“%d\n”,a);后a的数值是多少呢?
先分析:
在计算机内部是如何解读0xe0这个数据的呢?
如果当做是无符号数,那在内存的表示就是其原码,如下:
0xe0 = 1110 0000 = 128*1 + 64*1 + 32*1 + 16*0 + 8*0 + 4*0 + 2*0 + 1*0 = 224 (8位机中的表示法)
如果当做有符号数,最高位是符号位,1代表负数,0代表正数。
负数在计算机中是以补码的形式存贮的,也就是原码的各位取反后再加1,符号位不变。
因为最高位是1,所以这个数是负数。现在是已知这个负数在计算机中存贮的数值,求这个负数,顺序就是反过来了,先减一,再取反,符号位不变。如下:
0xe0 = 1110 0000 (8位机中的表示法)
先减一,结果为:x = 1110 0000 - 1 = 1101 1111
再取反,符号位不变,结果为:x = 1010 0000
首位1代表负号,这个数就是:
x = - (0*64 + 1*32 + 0*16 + 0*8 + 0*4 + 0*2 + 0*1) = -32
现在来验证一下-32这个数在计算机内存贮的数值是不是0xe0这个数呢?
因为32 = 0010 0000&