zoukankan      html  css  js  c++  java
  • 负数的二进制补码设计原理

    大家都知道:有符号数的负数的补码是 其正数的反码+1,例如 10001111 的补码是反码01110000 加 1 =01110001 ,很多书都这么说,可是为什么这样计算的结果就是它的补码?


        在某些计算机组成原理书上提到:其实补码的计算原理,是用一个模来减去无符号的正数部分。譬如时钟,12点之后是13点,但是时钟上没有13点怎么办?就用13减去12=1点。这个模是12.可惜这个比喻并不是很好。
               
         一个字节长的无符号数的表示范围 :0~255,有符号数的表示范围:-128~127 , 注意,这个表示范围的写法极有可能影响我们的思维,从而导致错误。我们应该这样来写:0~127 ~ -128 ~ -1 ,这才是较好的写法。为什么?因为这个写法的数的顺序与0~255 一一对应。
               
        由上,我们了解,其实补码不过是用128 ~ 255 这段范围的数来表示 ~128 ~ -1这段范围的负数。那么我们就可以凭自己,而不是看教材,就可以推测出计算补码的公式,就是:256-欲求的负数的绝对值= 此负数的补码。

    如上图所示:255(1111 1111)应该用来表示 -1  。 正1的反码为  254(1111 1110) 表示的是 -2 。

    因此 正1的反码(254) 再加上1 等于 255(表示-1)。  

    如果 255表示 -0 那么。二进制负数  =  其绝对值的反码

    如果 255表示 -1 那么。二进制负数  =  其绝对值的反码+1.(把它称为补码)

    同理 255如果表示 -2 那么。二进制负数  =  其绝对值的反码+2.

    这样使得,最高位既能参与运算,又当做正负号使用

  • 相关阅读:
    printf和sprintf
    操作数、运算符、表达式
    全自动加法机
    Ascll、GB2312、Ansi
    数组
    循环
    编程命名规范
    浮点数及缺陷
    Android编码规范
    RGB着色对照表
  • 原文地址:https://www.cnblogs.com/ahguSH/p/5445417.html
Copyright © 2011-2022 走看看