【微机】机器数的原码、反码、补码

微机机器数的原码、反码、补码

 一、相关基础知识                                                 

机器数:在机器中,用二进制表示有符号数,用最高位表示符号,其余的为数值位,这样一组连同符号也编码化的二进制数称为机器数。(符号位0为正,1为负)

 

真值:机器数所代表的数值大小称为机器数的真值( 即实际的值,有正负,例如1000 0001的真值 = –000 0001 = –11000 0001即为机器数)。

 二、具体内容                                                     

1.原码(True Form

   在机器数中最高位为符号位,符号位为0表示正数,符号位为1表示负数,其余为该数的绝对值,这种表示方法 就称为原码。

例如:

      8位二进制原码表示数的范围是-127+127,即-2^7-12^7-1,最高位为符号位

      0的原码有两种表示方法,即+0-0,设字长为8

      【+0】原= 0000 0000B

      【-0】原=1000 0000B

   采用原码表示法时,编码简单直观,与真值转换方便,便于人识别,但也带来一些麻烦

   一:是引起机器中零的表示不唯一,零有二义性,给机器判零带来麻烦,必须在设计时约定好机器采用正零或负零

   二:是不便于进行加减运算,用原码进行四则运算时,符号位需单独处理,而且原码加减运算规则复杂。

      

   N位二进制原码的表示范围为-(2-1)+(2-1)

2.反码(Ones Complement

正数的反码与原码相同。

负数的反码等于原码除符号位外,其余各位按位取反。即符号位依旧是01负,其余的取反

例如:   

       0的反码也有两种表示方法,即+0-0,设字长为8

      【+0】原= 0000 0000B  (与原码相同)

      【-0】原=1111 1111B   (符号位相同,其余取反)

   N位二进制反码的表示范围为-(2-1)+(2-1)

3.补码(Twos Complement

正数的补码表示与原码相同,即【X】补=X】原=X】反

负数的补码等于它的反码加1,即在其反码的最低位加1就为该数的补码

例如:

     0的补码只有一种就是 0000 0000,无论+0或者-0,在补码中也应没有-0的概念

     而原可表示-01000 0000 则表示为-128,则可多表示一个数,所以位于4int型,可以表示范围是: [-231 231-1] 

 

N位二进制补码的表示范围为-2+(2-1)

 三、分析总结                                                     

也即正数以原码存储,负数以补码存储,符号位0为正1为负,0的存储形式只有+00000 0000,没有-01000 0000表示-128,为2^(N-1)

为何计算机有原码、反码、补码?

   首先对于原码,人眼可很快根据最高位识别出一个数的正负且进行正确的加减运算,例如一个正数加上一个负数,我们能很快辨别出是等于这个正数减去负数的绝对值,但对于计算机,为设计简单,在计算机中只有加法器,没有减法器,CPU只会做加法,若用2个原码或反码进行相应加法则运算会发生错误,所以由相应的规定人为可以很轻松看出真值的原码,到规定计算机原码到补码转化过程中的反码,再到最后规定了可只用加法器就能进行正确运算的补码,所以计算机中的所有数都是补码形式进行存储!(基本可以这样认为,负数用补码表示,正数的原码等于补码) 

   总之采用补码可用加法的运算代替减法运算,从而可以简化硬件结构,降低成本!

为什么以补码形式存储能让CPU进行正确运算?

  形象的可解释为在日常生活中,如钟表系统,若当前世界为10点,我想将时间调回8点,第一种方法是往回拨即逆时针旋转2小时、旋转14小时、旋转26小时。。。。。

第二种方法是往前拨即顺时针旋转10小时、旋转22小时、旋转34小时。。。。。

若顺时针拨为正,逆时针为负则用数字表示即调时间方法为:

10-2=8时  10+10=20=8时 也即 10-2=8  10+10=8

很巧妙的将102变成了加10,因为时针是圆的,时针一圈为12小时,上午8点与晚上20点在时针上的位置是一样的,因为他们相差12小时,20点减去一个周期12小时即得到了8

这在数学上称其为共模同余,其中12称为时针技术系统的模,也即10-2=10+10Mod 12)  

计算机也正是用这以数学思想,巧妙的将原来本是减法运算转换成可进行正确的加法运算

也就是说假设是在当模为12时,我们需要计算机进行10-2的运算,计算机将10存为补码10-2存为补码10,然后进行相加,所得的结果为20,由于超过了位码,舍去了计数器的一个最高位也即模的大小,即12,剩下位数为88依旧为补码,再转换成原码输出给我们,为8不过计算机采用的模不是12,而是2!)

对于字长为N位的二进制计数系统,某一个数X其绝对值小于模数|X|<2,补码定义如下:

                              【X】补=2+X

X为正数,即0X<2-1,则【X】补=2+X=X,因为计数器加上2,超过位数,自然丢失这一位,等于没加,见后例

X为负数,即-2X0,则【X】补=2+X=2-|X|,即该数补码为模减去该负数的绝对值(这也形象说明计算机采用的是共模同余的这种数学思想,虽然计算机无法进行2-|X|这种减法运算,不过计算机能够判断符号位是0还是1,以及将1变成00变成1,也能进行加1操作,进行这些操作也即是负数的补码是等于它的反码加1

 

通过这样定义的补码存储在计算机当中,当进行运算时若有超过模的部分位数会被自然丢失,剩下位数所得结果再转换成相应的原码即为正确运算结果

       

 四、实例测试                                                    

例:

计算64-10=

 在字长为8为的二进制计数器系统中

64的补码为: 0 100 0000B

-10的原码为:1 000 1010B

-10的反码为:1 111 0101B

-10的补码为:1 111 0110B  

   

 然后将2数的补码相加:

   0100 0000=+64】补

+  1111 0110=-10】补

  1 0011 0110=+54】补

1由于为8位系统,被自然丢失!0011 0110表示的补码原码也为0011 0110,即表示+54,也与事实相符


原文地址:https://www.cnblogs.com/Ahair/p/5005566.html