计算机原码反码补码

计算机中保存的数据都是按照补码来保存,涉及到的概念,原码反码补码具体是什么,通过下面几个例子来说明下。

正数

正数的原码,反码和补码是一样的。正数的原码,其最高位代表符号位,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

(2)https://www.cnblogs.com/youngchaolin/p/10463887.html

(3)https://www.cnblogs.com/nicerblog/p/11348608.html

posted @ 2019-08-02 18:30  斐波那切  阅读(1443)  评论(0编辑  收藏  举报