• 闲扯原码、反码、补码(转载)


     相信大家看到这个标题都不屑一顾,因为在任何一本计算机基础知识书的第一章都有他们的解释,但是在书上我们只能找到一些简单的定义,没次看过之后不久就忘了。最近论坛里有人问起这些概念,看到很多人的回复是以前看过现在忘了去看看某某书之类,很少有给出一个合理的解释。于是本人就开始思考(虽然上帝会发笑,我还是要思考。),于是得出了以下的结论。

     

         数值在计算机中表示形式为机器数 , 计算机只能识别 0 和 1, 使用的是二进制 , 而在日常生活中人们使用的是十进制 ," 正如亚里士多德早就指出的那样 , 今天十进制的广泛采用 , 只不过我们绝大多数人生来具有 10 个手指头这个解剖学事实的结果 . 尽管在历史上手指计数 (5,10 进制 ) 的实践要比二或三进制计数出现的晚 ."( 摘自 << 数学发展史 >> 有空大家可以看看哦 ~, 很有意思的 ). 为了能方便的与二进制转换 , 就使用了十六进制 (2 4 ) 和八进制 (23 ). 下面进入正题 .

    数值有正负之分 , 计算机就用一个数的最高位存放符号 (0 为正 ,1 为负 ). 这就是机器数的原码了 . 假设机器能处理的位数为 8. 即字长为 1byte, 原码能表示数值的范围为

    (-127~-0 +0~127) 共 256 个 .

      有了数值的表示方法就可以对数进行算术运算 . 但是很快就发现用带符号位的原码进行乘除运算时结果正确 , 而在加减运算的时候就出现了问题 , 如下 : 假设字长为 8bits

    ( 1 ) 10 -  ( 1 )10   =  ( 1 )10   + ( -1 )10   =   ( 0 )10

    (00000001)原   + (10000001)原   = (10000010)原   = ( -2 )  显然不正确 .

      因为在两个整数的加法运算中是没有问题的 , 于是就发现问题出现在带符号位的负数身上 , 对除符号位外的其余各位逐位取反就产生了反码 . 反码的取值空间和原码相同且一一对应 . 下面是反码的减法运算 :

      ( 1 )10   -  ( 1 ) 10 =  ( 1 ) 10 + ( -1 ) 10 =   ( 0 )10

      (00000001) 反 + (11111110)反   =  (11111111)反   =  ( -0 )   有问题 .

    ( 1 )10   -  ( 2)10   =  ( 1 )10   + ( -2 )10   =   ( -1 )10

    (00000001) 反 + (11111101)反   =  (11111110)反   =  ( -1 )  正确

    问题出现在 (+0) 和 (-0) 上 , 在人们的计算概念中零是没有正负之分的 .( 印度人首先将零作为标记并放入运算之中 , 包含有零号的印度数学和十进制计数对人类文明的贡献极大 ).

    于是就引入了补码概念 . 负数的补码就是对反码加一 , 而正数不变 , 正数的原码反码补码是一样的 . 在补码中用 (-128) 代替了 (-0), 所以补码的表示范围为 :

    (-128~0~127) 共 256 个 .

    注意 :(-128) 没有相对应的原码和反码 , (-128) = (10000000)   补码的加减运算如下 :

    ( 1 ) 10 -  ( 1 ) 10 =  ( 1 )10   + ( -1 )10   =   ( 0 )10

    (00000001)补   + (11111111)补   =  (00000000)补   = ( 0 )  正确

    ( 1 ) 10 -  ( 2) 10 =  ( 1 )10   + ( -2 )10   =   ( -1 )10

    (00000001) 补 + (11111110) 补 =  (11111111)补   = ( -1 )   正确

       所以补码的设计目的是 :

         ⑴使符号位能与有效值部分一起参加运算 , 从而简化运算规则 .

    ⑵使减法运算转换为加法运算 , 进一步简化计算机中运算器的线路设计

      所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、 C 等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

  • 相关阅读:
    什么是聚集索引,什么是非聚集索引,什么又是主键?
    给.net添加MultiPage、TabStrip、Toolbar、treeView,treeview等控件
    一个洗牌程序算法,随机交换位置【经典】
    overload和override都叫重载,都在什么情况下用阿?
    补间形状和补间动画
    电子时钟
    绘图板
    查询XML数据
    纯代码生成按钮
    小球滚动,方块上移
  • 原文地址:https://www.cnblogs.com/zhuzhu_/p/1691052.html
Copyright © 2020-2023  润新知