在计算机中,整数有三种表示方法:原码,补码,反码。(都是二进制)
这三种表示方法均有符号位和数值位两个部分
其中正数的原码,反码,补码是相同的,
而负数的原码,补码,反码需要计算。
原码
直接将整数按照正负数的形式翻译成二进制
反码
将原码的符号位不变,其他位依次按位取反就可以得到
补码
反码+1,得到补码
注: 整数在内存中以二进制补码储存
为什么?
原因在于,使用补码,可以将符号位和数值域同一处理,同时,加法和减法可以统一处理
我们举例说明:
CPU中只有加法器
1-1可以看成1+(-1)
//1-1
//1+(-1)
//使用原码计算
//00000000000000000000000000000001 —— 1
//10000000000000000000000000000001 —— -1
//结果:10000000000000000000000000000010 —— -2
//结果1-1=-2,显然是错误的
//使用原码计算是错误的
//1-1
//1+(-1)
//使用补码进行计算
//00000000000000000000000000000001 —— 1的补码
//11111111111111111111111111111111 —— -1的补码
//结果:00000000000000000000000000000000 —— 0的补码
//可以使用补码运算
原码,补码,反码的相互转化:
例子:int a = 5 ; 5的二进制为101,而a为整形,占4字节=32比特位
5的原码:00000000000000000000000000000101(直接根据二进制写出)
反码:00000000000000000000000000000101 (正数原反补相同)
补码:00000000000000000000000000000101
以负数举例:int a = -5;
原码:10000000000000000000000000000101(最高位改为1)
反码:11111111111111111111111111111010(符号位不变,其他位按位取反)
补码:11111111111111111111111111111011(反码+1)