• 原码、反码和补码


    🔥 本文由 程序喵正在路上 原创,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,符合我们的数学逻辑

  • 相关阅读:
    【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型
    【小白笔记】pikachu之文件包含漏洞
    React之事件机制与事件绑定
    理解JS的三座大山
    快手治理低质量直播内容,运营者需要注意什么?
    百度OCR识别图片文本字符串——物联网上位机软件
    Deepin下vsftp服务安装配置
    【uniapp】Dcloud的uni手机号一键登录,具体实现及踩过的坑,调用uniCloud.getPhoneNumber(),uni.login()等
    error while loading shared libraries: libgo.so.19 错误的解决
    day07域
  • 原文地址:https://blog.csdn.net/weixin_62511863/article/details/126795189