zoukankan      html  css  js  c++  java
  • 【微机】机器数的原码、反码、补码

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

     一、相关基础知识                                                 

    机器数:在机器中,用二进制表示有符号数,用最高位表示符号,其余的为数值位,这样一组连同符号也编码化的二进制数称为机器数。(符号位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,也与事实相符


  • 相关阅读:
    docker镜像
    docker常用命令
    docker基础
    跨站脚本漏洞(XSS)基础
    Session、Cookie与Token
    linux之curl工具
    ssl证书与java keytool工具
    mysql主从复制
    linux之平均负载(学习笔记非原创)
    mysql8.0忘记密码如何操作?
  • 原文地址:https://www.cnblogs.com/Ahair/p/5005566.html
Copyright © 2011-2022 走看看