计算机原码反码补码
计算机中保存的数据都是按照补码来保存,涉及到的概念,原码反码补码具体是什么,通过下面几个例子来说明下。
正数
正数的原码,反码和补码是一样的。正数的原码,其最高位代表符号位,1代表负数,0代表正数,具体看例子。
int 20的原码?可以很快的得到如下结果,32个bit,高位补齐为0即可。
原码:00000000 00000000 00000000 0001 0100
根据规则,其反码和补码如下。
反码:00000000 00000000 00000000 0001 0100
补码:00000000 00000000 00000000 0001 0100
负数
负数的原码,最高位为1,反码是固定最高位的情况下,其他低位1变0,0变1,补码是反码的基础上加1,具体看例子。
int -20的原码?可以很快的得到如下结果,32个bit,除了最高位为1,其他高位补齐为0即可。
原码:10000000 00000000 00000000 0001 0100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
0
考虑到高位为0时,其他位全部为0可以表示为+0,高位为1时,其他位全部为0有可以表示为-0,这样就有两个0,在计算机中-0代表当前数据类型的最小值。
1 public class operatorDemo{ 2 3 public static void main(String[] args){ 4 //测试自增自减类型转换 5 byte b=127; 6 //b+=1;//这样写没问题 7 //b=b+1;//这样写编译不通过 8 b++;//这样写没问题 9 System.out.println(b); 10 } 11 12 }
输出结果为-128,因为byte 127补码为0111 1111,执行自增运算首先变成了int类型即00000000 00000000 00000000 0111 1111,然后加1变成00000000 00000000 00000000 1000 0000,最后向下转型舍弃高位为byte变成1000 0000,这就是-0,发现通过这个补码无法推测反码再原码,这样就人为规定为-128了,计算机处理这个补码时按照-128来处理。如果byte类型补码是1111 1111时,应该是多少呢?这个高位为1一看就是负数,可以轻松推出反码为1111 1110,再推出原码为1000 0001,这个原码则代表的就是-1,可以看出来补码1111 1111~1000 0000代表范围为-1~-128的负数。
参考博文:
(1)https://www.jianshu.com/p/47761557bab0