关于补码的一篇短文

关于补码的一篇短文

首先要记住一点:计算机中数字是以二进制的补码形式来表示的。

 

计算机中表示的二进制数又称为“机器数”,机器数带有符号,符号位就用这个二进制数的最高位表示,其中0表示正数,1就表示负数。举例来说:十进制的8用二进制来表示是为00001000(这里假设用一个字节共8位表示)

8=00001000;-8=10001000

 

当然谈到补码总离不开原码,反码等这些概念,别急,先来了解一下原码等概念。

 

原码

一个正数的原码当然就是他本身转换成二进制的形式:

                        如:8=00001000

而一个负数就只要符号位置1其余为该负数的绝对值的二进制形式:                                                     如:-8=10001000

(题外话)

我们知道java中一个byte类型的数值是用一个字节表示的,那么我们就很容易知道他的取值范围是[11111111~01111111]即[-128~127],总共也就256个数字,大家如果仔细去看过jdk源代码的话,他把这256个数字都缓存起来了,于是我们可以猜猜下面这两个表达式的值应该为True还是False

 

                   Byte b1 = 127;
                   Byte b2 =127;
                   System.out.print(b1==b2);   //true


                   Integer i1 = 128;
                   Integer i2 = 128;
                   System.out.print(i1==i2);//false

 

 

 

反码:分为两种情况,正数的反码就是他本身了,负数的反码就是除了最高位的符号位保持1不变之外其他位取反。

                                             如:8=00001000

                                                    -8=11110111

 

补码:同样正数的补码也是其本身,负数就是在原码的基础上除符号位之外的位取反,然后最低位加1.                        

                                             如:8 = 00001000

                                   -8 = 11110111+1=11111000

 

小结:正数的原码=反码=补码,负数稍微复杂点,原码就高位为1,其他位和该负数对应的正数的原码一样。反码和补码都是建立在原码的基础上,反码就是除高位不变之外其他为取反即可。而补码同样是最高位不变其余位取反再最后一位加1.

 

总结:为什么计算机要用补码来表示数字呢?我们不妨来举例说明,计算机中做加减乘除是很复杂的,如果减法也可当加法用那就可以省事多了.

比如:1-1=1+(-1),

如果用源码做加法00000001+10000001=10000010=-2显然结果不对。

要是用反码:00000001+11111110 = 11111111=-0然而负数0没什么意义。如是出现了补码:00000001+11111111=00000000=0,这个就是我们需要的结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值