• 原码、反码和补码


    🔥 本文由 程序喵正在路上 原创,CSDN首发!
    💖 系列专栏:计算机组成原理
    🌠 首发时间:2022年9月10日
    🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
    🌟 一以贯之的努力 不得懈怠的人生

    引入

    在计算机里面,都是以 补码 的形式来存储数据的

    那么可能就会有小伙伴会问,那我们学习补码就行了,为什么还要学习原码和反码呢?

    举个栗子,我们本来只会中文,但为了去阅读英文书籍学习英文,一种方法就是将英文书籍翻译成中文再来阅读,如果我们不会中文也就无法去学会英文

    同样地,原码和反码也是学会补码的前提

    原码

    众所周知,一个字节就是 8 个位

    直接讲概念可能不太好理解,下面我们以一个字节为例来说原码

    最高位为符号位,0 代表正数,1 代表负数,后面的非符号位为该数字绝对值的二进制形式

    以一个字节为例,那它的最高位,也就是第 7 位,如果是 0,表示这个数值位正数;如果是 1,表示这个数值为负数

    来看一个具体的例子,5-5 两个数的原码分别为:0000 01011000 0101

    反码

    学会了原码之后,反码就变得很简单了

    反码的规则是

    正数的反码和原码一致;负数的反码是对原码按位取反,只是最高位(符号位)不变

    我们还是来看 5-5 这个例子:

    5 是正数,反码和原码一样,为 0000 0101

    -5 是负数,最高位不变,依旧为 1,其他位取反,为 1111 1010

    补码

    最后我们来看补码

    补码的规则是

    正数的补码与原码一致;负数的补码是该数的反码加 1

    我们还是来看 5-5 这个例子:

    5 是正数,补码和原码一样,为 0000 0101

    -5 是负数,其反码为 1111 1010,再加上 0000 0001,为 1111 1011

    为什么用补码来存储数据

    既然有原码、反码和补码,那为什么我们在计算机中要用补码来存储数据呢?

    我们还是以 5-5 这个例子来看

    学过计算机基础的小伙伴应该都知道,CPU 里面有加法器,什么是加法器啊?

    就是里面会进行加法的运算

    那么 CPU 里面有没有减法器啊?

    其实,是没有减法器的,那计算机怎么进行减法呢?

    比如,5 - 5 这个算式,我们可以将它转变为 5 + (-5),我们试着用原码来进行这个算式的计算

    0000 0101
    1000 0101
    相加得到
    1000 1010

    根据我们刚刚学到的知识,来看一个这个计算结果,最高位为 1,表示这个数值是个负数,后 7 位表示的值为 10,即结果为 -10,这显然不对

    接下来我们用反码来进行计算

    0000 0101
    1111 1010
    相加得到
    1111 1111

    1111 1111 转变为原码,是 1000 0000,也就是 -0,有的小伙伴说那这样不就对了

    但是你想一想,0000 0000 也表示 0,那我们这不就矛盾了,两个不一样的二进制数的值是一样的,所以用反码来表示也不行

    最后,我们来试试补码

    0000 0101
    1111 1011
    相加得到
    1 0000 0000

    因为一个字节只有 8 位,所以得把最高位的 1 去掉,也就是 0000 0000,符合我们的数学逻辑

  • 相关阅读:
    mac通过docker搭建elasticsearch:8.9.2以及kibana:8.9.2
    服务器技术(二)--Linux进阶应用(3)--Bash Shell及Linux部署办公OA项目实践
    Lwip之TCP协议实现(一)
    gulp 错误集锦
    mybatisPlus批量插入性能优化
    DBS note3:B+ Trees
    git常用命令以及常见错误处理
    学习Hadoop(一)——搭建hadoop集群
    使用GParted为Ubuntu根目录扩容
    系统缓存设计
  • 原文地址:https://blog.csdn.net/weixin_62511863/article/details/126795189