您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页二进制和补码

二进制和补码

来源:华佗小知识


计算机中的数值的二进制表示

BIGSUN

日常生活中人们使用的是十进制计算,也就是使用0,1,2,3,4,5,6,7,8,9来计数。而数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制。

1原码表示法

数值有正负之分,人们平时用+\\-来表示十进制数的正负。计算机采用的是用一个数的最高位存放符号位(0为正,1为负).这种表示方法就是机器数的原码了。假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为(-127~-0 +0~127)共256个.没错+0和-0是两个数。一个是000000002别一个是100000002。 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。

例如,X1= +1010110(86)

X2= 一1010110(-86)

其原码记作:

[X1]原=[+1010110]原=01010110

[X2]原=[-1010110]原=11010110

如何把一个十进制转换为二进制呢,一般采用“除2取余,逆序排列”法。比如

86(1010110)。

图1 除2取余逆序排列法

如何把一个十进制小数转换为二进制小数,一般采用“剩2取整,顺序排列”法。比如0.6(1010110)。

图2 乘2取整顺序排列法

从二进制转换回十进制的方法:按位加权法。

1 1 0 0 1(25)

1*2^4 +1* 2^3 + 0*2^2+0*2^1+1*2^0 =16+8+0+0+1=25

1 0 0 1 1(0.6)

1*2^-1+0*2^-2+0*2^-3+1*2^-4+1*2^-5=0.5+0+0+0.0625+0.03125=0.59375

整数部分除2取余大家好理解,反之转回来就是乘2相加,小数部分乘2取整是怎么实现原小数记数呢??其实很好理解,假如这个数是X,那计算机每的表示方法就是看X是否大于2^-1(0.5)如果大于记为1,如果不大于记为0。不管记为1还是记为0,经过第一步的操作,这个剩下的数肯定小于0.5,然后再把这个数和2^-2(0.25)比,大于记为1小于记为0,如此类推。也就是说,任何一个数都可以表达成。

X=Y1*0.5+ Y2*0.25+Y3*0.125*Y4*0.0625…

=Y1*2^-1+Y2*2^-2+Y3*2^-3*Y4*2^-4…

式中Y1,Y2,Y3,Y4,就是小数的二进制1或0。

原码表示数的范围与二进制位数有关。当用8位二进制来表示小数原码时,其表示范

围00000000(+0)~01111111(+127)和10000000(-0)~11111111(-127),这种记数方法0有两种表示(00000000和10000000)显然这种记数方法是不科学的。

2反码的表示

如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反

例如:X1= +1010110

X2= 一1001010

[X1]原=01010110

[X1]反=01010110

[X2]原=11001010

[X2]反=10110101

反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。

3补码表示法

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。

例如,[X1]=+1010110

[X2]= 一1001010

[X1]原=01010110

[X1]补=01010110

即 [X1]原=[X1]补=01010110

[X2]原= 11001010

[X2]补=10110101+1=10110110

4计算机中为什么要用补码

有了数值的表示方法就可以对数进行算术运算.我们学习四则运算时都知道减去一个数,等于加上绝对值相等的负数。为了简化计算机中的运算,计算机不做减操作只做加操作,也就是要把负数存成相应的一个正数以便进行加运算。

图3钟表记数法

假设只有8Bit的字长,现在我们用钟表求时间法来简单说明一下补码参与运算的原理。

3点+3(小时)=6点,这说明了钟的顺时针的转动。

3点-3(小时)=12点也相当于0点。这是逆时候的转动。

3点+9(小时)=12点也相当于0点。这也是顺时针的转动。

从这里可以看出逆时针的转动3和顺时针的转动9是一样的,这时候我们说以12为全集时-3和9互补.按照这个方法,我们规定了8位字长计数和它们的补码。

图4计算机内存补码表示法

8位字长时一共可以表达的计数是256个(0~255)如果0~127为正数区128~255就是负数区,以256为全集负数就可以用相应的补码表示:-1[255]、-2[254]。依次类推-127的补码是129,这样出现了-128的补码是128。有意思的是,128无法用8位字长来表示其原码,故(-128)没有相对应的原码和反码, (-128) = (10000000)。

按照这个法则,当我们进行3-12的运算时,计算机中实际进行的是

-12的补码是256-12=244(11110100)所以真正参加运算的是

00000011(3)+11110100(-12)=11110111(247)而247对应的负数是-256+247=-9。结果是正确的。

假设有一个数的补码是[X]补。如何求它的原码[X]原呢?根据定义我们得到下图的理解:

图5补码和反码的关系

为什么反码+1就是补码呢,我是这样理解的,因为256是8位的全集,一个负数的补码的最高位又是1,那么256-128=128。原码+反码+1=128。这就是为什么补码-1再求反就是原码的原因所在。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务