在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(cpu只有加法器),此外补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
例如运算1-1的时候,由于cpu只有加法器,实际上是计算1+(-1):
1的原码: 00000000 00000000 00000000 00000001
-1的原码: 10000000 00000000 00000000 00000001
如果使用原码计算,得到的是:
100000000 00000000 00000000 00000010
转化为十进制是:-2,并不是想要的结果
1的补码:00000000 00000000 00000000 00000001
-1的补码:11111111 11111111 11111111 11111110
使用补码计算的结果是:
1 00000000 00000000 00000000 00000000
共有33位,整型只能存放32位置,最高位被丢弃
所以,转化为十进制是:0
负数的原码和补码之间的转换:
原码 -->补码
反码:原码符号位不变,其余位取反
补码:反码加1
补码 -->原码
第一种:补码符号位不变,其余位取反再加一得到原码
第二种:补码减1,符号位不变,其余位取反得原码
-10
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
补码取反:10000000 00000000 00000000 00001001
加1:10000000 00000000 00000000 00001010(得到原码)