zoukankan      html  css  js  c++  java
  • 原码,反码与补码理解

    原码,反码与补码理解

    1. 写作目的

           平时学习总结的学习笔记,方便自己理解加深印象。同时希望可以帮到正在学习这方面知识的同学,可以相互学习。新手上路请多关照,如果问题还请不吝赐教。

    ----------

    2. 前置知识 字节 → 位 → 二进制数

        计算机存储数据使用字节进行存储,机器有32位,64位为一个最小存储单元,1个字节为8位,那么32位机器一个存储单元存储4个字节,64位机器一个存储单元为8个字节。计算机使用二进制来表示数据,1位代表一个二进制数,要么是1,要么是0。

    3. 引出原码

        既然是数据,那么就有大小,就需要对数值进行运算。我们用真值来表示数据的大小,正负。

    十进制:+8 = 二进制:+1000

    十进制:-6 = 二进制:-0110

    +1000,-0110既是真值,但是计算机在存储数据时没有单独存储数值的正负,而是同样用1,0来存储负,正,那么这就是原码表示。

    十进制:+8 = 二进制:01000

    十进制:-6 = 二进制:10110

    表示是没有问题?但是问题又出现了,那就是如果是同符号运算,我们很好算,如果符号不相同的两个数相加,我们首先要判断哪个数更大,然后相减得到结果,再用大数的符号标注,这样每次算更加麻烦。而且计算机没有设计减法运算,只有加法运算,因为加法运算更加快速。我们如何来实现2个数的减法。下面就是加法转减法的思路:

    4. 同余模数

        以表盘为例:表盘有12个刻度,走完12个刻度后回到原点。如果时针指向3点,我想回拨到2点,那么我的方法有,① 直接回拨一个刻度,② 向前拨11个刻度。方法 ① 很好理解,为什么方法 ② 同样可以,明明是向前拨也达到了同样的效果,12就是模,当拨够了12个刻度,就舍去了12,也就是舍去了模。3+11 = 14,14 - 12 = 2,所有同样是2点。在这里 1 ≡ 11是同于模数,模为12。 又因为 1 ≡ 13 ≡ 25,所以正数的同于模数就是它本身。这些都有相应的计算同余模数的公式 。

        有了以上的知识,我们就能往下继续了。我们可以应用同余模数来把加法变成减法,比如:
    01000 - 00010;我们需要把 减 00010 变为 加上一个数,那么加上数即为这个数的同余模数。按照上边的公式,同余模数 = $2^4+1$ - 00010 = 100000 - 00010 = 11111 + 00001 - 00010 = 11111 - 00010 + 00001 = (1 x1x2x3x4)+ 00001。 通过变形,我们发现如果想要求得负数的同余模数,我们只需要保证这个数的符号位不变,其他位取相反数(因为1减去一个数,可以看成是求这个数的相反数),最后+1,即可。

    5. 重点来了

        有了这个规律,我们就引出了反码,补码。反码就是原码符号位不变,其它位取反,他就是我们通向补码的中间产物。那么我们的补码就是我们的同余模数,加减运算使用补码完成。小弟不才,原码,反码,补码的来龙去脉我目前只能理解到这样的程度。

    6. 画龙点睛

         真值为0时: +0000,-0000,有2中表现形式;
         原码: 00000, 10000,有2中形式;
         反码: 00000, 11111,有2中形式;
         补码: 00000,10,0000(0,0000) 一种形式。
    我们看出 原码有2个0,反码有2个0,补码只有一个0。


    参考文档:

    《计算机组成原理第二版-唐朔飞》

    原码、反码、补码 详解 腾讯云社区

  • 相关阅读:
    Eclipse安装Git插件及简单操作
    物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)
    版本分支管理标准
    社交的基本逻辑
    委托投资方案
    印钞机 V1.0(量化选基总结)
    中小研发团队架构实践之总体架构设计
    FOF 全面科普贴(转载)
    DUIR Framework 相关技术介绍
    使用融资的心得和教训
  • 原文地址:https://www.cnblogs.com/timestore/p/11159303.html
Copyright © 2011-2022 走看看