原码: -16 = 10010000 1表示符号位(1负0正)
反码: -16 = 11101111
补码: -16 = 11110000
原码: 9 = 00001001 1表示符号位(1负0正)
反码: 9 = 00001001
补码: 9 = 00001001
-16 + 9
11110000
+ 00001001
11111001(补码)
11111001的反码 10000110
11111001的原码 10000111 = -7
-7 原码 100000111
-7 反码 111111000
-7 补码 111111001
补码减1得到反码,反码取反得到原码
-----------------------------------------------------------------
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
short a, b, c;
a = 32767;
b = a + 1;
c = b + 1;
printf("%d\n", sizeof(a));
printf("a = %d, b = %d, c = %d", a, b, c);
getchar();
return EXIT_SUCCESS;
}
运行结果:
因为a = 32767,正数的原码反码补码都是一样,内存中数据用补码表示,所以a在内存中表示为0111 1111 1111 1111
1在内存中的表示为0000 0000 0000 0001
于是a + 1 对补码进行与运算得到
0111 1111 1111 1111
0000 0000 0000 0001
---------------------------------------
1000 0000 0000 0000
而1000 0000 0000 0000最高位是1表示负数,又因为其是补码,补码减1取反得到:
1000 0000 0000 0000
0000 0000 0000 0001
------------------
1111 1111 1111 1111
对1111 1111 1111 1111 取反得到
1000 0000 0000 0000 值为-32768
因为-32768 在内存中的补码为: 1000 0000 0000 0000
当-32768 + 1 表示为:
1000 0000 0000 0000
0000 0000 0000 0001
-------------------------------------------------
1000 0000 0000 0001
1000 0000 0000 0001为补码,对其减1取反:
1000 0000 0000 0001
0000 0000 0000 0001
-----------------------------------
1000 0000 0000 0000
对1000 0000 0000 0000取反得到:
1111 1111 1111 1111表示数值-32767