计算机中的数值的二进制表示
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再求反就是原码的原因所在。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。