补码究竟是什么?

这篇具有很好参考价值的文章主要介绍了补码究竟是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 什么是补码

计算机底层均是通过二进制表示数据,原码、反码、补码是计算机中对数字的二进制表示方法。计算机以二进制补码的形式存储整数,最高位是符号位,0 表示正数,1 表示负数,其余位为数字位。

  • 原码:将最高位作为符号位(0 表示正,1 表示负),其它数字位代表数值本身的绝对值的数字表示方式。

  • 反码:如果是正数,则表示方法和原码一样;如果是负数,将其绝对值的原码各位取反,则得到这个数字的反码表示形式。

  • 补码:如果是正数,则表示方法和原码一样;如果是负数,则将其反码加上 1(相当于将原码数值位取反,然后在最低位加 1)。

  • 正数的原码、反码、补码完全一样,只有负数需要按照以上规则计算。

  • 0 的反码、补码都为 0。

在计算机内部使用固定数量的位来表示整数:比如 32 或 64 ,简单起见,我只考虑 8 位。以 8-bit 二进制数表示十进制整数。它的可表示范围包括 - 128 到 127,即总共可以表示 256(2^8)个整数。

如计算 -3 的二进制补码,先计算 3 的原码 0000 0011,取反得到 1111 1100,再加 1 为 1111 1101。

数字

3

-3

原码

0000 0011

1000 0011

反码

0000 0011

1111 1100

补码

0000 0011

1111 1101

2 为什么使用补码

  1. 计算机为什么要用补码表示负数,而不是只改变正数的符号位,使用原码表示负数进行计算呢? 用原码表示负数,看起来很简单易懂,但是进行加减等计算时,就会很麻烦。 +3 原码为 0000 0011,-3 原码为 1000 0011,这两个数相加,直观上应该等于 0,但是相加结果为 0000 0011 + 1000 0011 = 1000 0110,2000 0110 不管怎么解释都不会为 0。

  2. 使用原码计算时,那么 0 就有两种表示形式:正 0(0000 0000)和负 0(1000 0000),这显然也是我们不愿看到的。

如果计算机内部采用原码来表示数,那么在进行加法和减法运算的时候,需要转化为两个绝对值的加法和减法运算。计算机既要实现加法器,又要实现减法器,代价有点大,那么可不可以只用一种类型的运算器来实现加和减的远算呢?

补码的出现,就是为了解决这个问题的,使得计算机通过使用加法器就可以得到实现符合直觉的结果。

采用补码形式计算 +3-3 =,+3 补码为 0000 0011,-3 补码为 1111 1101,计算过程为 0000 0011 + 1111 1011 = 0000 0000,符合我们的直觉。

3 补码的实现原理

补码究竟是什么?

将时针从12点顺时针拨2个小时,和顺时针拨14个小时,和逆时针拨10个小时都是指向2,因为时钟一圈是12个小时。

12 + 2 = 14; 12 + 14 = 26; 12 - 10 = 2

也就是说14、26、2在表盘上是相同的表现形式,将它们除以 12,得到相同的余数 2;12小时代表时钟旋转一周,在计算机里类似的概念叫模,它可以实现化减为加,本质上是将溢出的部分舍去而不改变结果。

3.1 无符号二进制数

在计算机中使用 8 位无符号二进制数,可以表示 0 ~ 255 之间的任意数字,一共 256 位数字,表示范围的模为 256。在进行计算时,计算机只会读取低 8 位的数据,就会出现如下情况:1 与 257 的在此计算机看来是表现一样的,因为任何大于 255 的数都不能用 8 位二进制表示,溢出的部分会被舍去。

补码究竟是什么?

8 位二进制可以表示 256 个数,把它们围成一个圈,如下图所示:

补码究竟是什么?

可以看到 0000 0001 与 1 0000 0001 重叠在相同位置。

3.2 有符号二进制数

在计算机中使用 8 位有符号二进制数,有符号数的表示范围是-128~127。

如前所述,如果使用原码表示整数,那么进行加减运算时,有符号二进制数之间的运算需要制定与无符号二进制数不同的规则,否则得到的结果不符合直觉;但是用补码表示整数,有符号二进制数之间的运算有符号二进制数之间的运算则可以实现与无符号二进制数相同的计算规则。

补码究竟是什么?

从 0 开始,往前走 n 步,和往后走 256-n 步,到达的是相同的位置。

无符号数和有符号数的模都是 256,1111 1111 表示无符号数的 255,也可以表示有符号数的 -1。

有了同余这个机制,无论是无符号数还是有符号数,计算机都可以使用相同的规则进行计算,同样的二进制输入,肯定会得到同样的计算结果,把计算结果看作是无符号还是有符号,计算机是不管的,是由我们说了算。而且这种表示方法也解决了 0 有两种表现形式这个问题,0000 0000 表示 0,1000 0000 则为 -128。

比如对于二级制算式 1000 0000 + 0000 0111 = 1000 0111,我们可以看做是无符号数计算 128 + 7 = 135,也可以看做有符号数计算 (-128) + 7 = (-121)。

同样的,二进制算式 0001 0000+1111 1101 = 1 0000 1101,可以看做是无符号数计算 16 + 253 = 13,也可以看做有符号数计算 16 +( -3) = 13。

补码的本质:找到一个替代负数(-3)的正数(253),并用此正数的二进制形式参与运算,进行加法运算后,将得到的结果中溢出的数字舍去后,只读取结果中固定位数(此处是 8 位)的二进制数作为运算的结果。

4 补码的计算方法

  1. 正数的补码与原码相等。将最高位作为符号位,其余各位,其它数字位代表数值本身的绝对值。

  2. 负数的补码有两种计算方式

  • 先求出该负数绝对值的原码,再全部取反得到该负数的反码,最后加1即得补码。

  • 负数N + 模M = sum,sum对应的无符号二进制数既是该负数的补码。

第一种是根据补码的定义计算,前面已经详细介绍。

第二种是引入模之后获得的计算补码的新方式:比如计算 -3 的二进制数,256 + (-3) = 253,253 的无符号二进制形式为 1111 1101,因此 -3 的补码就是 1111 1101。

添加文章封面算机运算是如此方便与优雅,所以现代计算机系统统一采用这种数字表示方法。文章来源地址https://www.toymoban.com/news/detail-434268.html

到了这里,关于补码究竟是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【趣话计算机底层技术】一个故事看懂各种锁

    我是一个线程,一个卖票程序的线程。 自从我们线程诞生以来,同一个进程地址空间里允许有多个执行流一起执行,效率提升的同时,也引来了很多麻烦。 我们卖票线程的工作很简单,比如票的总数是100,每卖一张就减1,直到变成0售完为止。 以前单线程的时候没啥问题,

    2024年02月05日
    浏览(38)
  • 从今天起,换一种轻松有趣的方式学习计算机底层技术!

    大家好,我是轩辕之风。 告诉大家一个好消息,我的  《趣话计算机底层技术》  系列技术故事图书终于出版了!   印刷厂新鲜出炉的第一批图书,已经上线京东、当当啦!   你还记得那个CPU一号车间的阿Q吗?这一次它要继续讲故事给你听啦! 我为什么要写这本书呢? 在

    2024年02月08日
    浏览(42)
  • 【带你深挖计算机底层逻辑,带你认清CPU与主存之间的工作原理】

    计算机底层原理 文章目录 系列文章目录 前言 一、什么是主机 二、CPU 三、两类存储器 总结         带你深入理解计算机底层原理,为日后写出更健壮更安全更高效的代码打下坚实的基础,计算机硬件最底层的实现就如同建筑物的地基,清晰地掌握底层原理对大家将来编程

    2023年04月19日
    浏览(41)
  • 计算机视觉 计算机视觉识别是什么?

    计算机视觉识别(Computer Vision Recognition)是计算机科学和人工智能领域中的一个重要分支,它致力于使计算机系统能够模拟和理解人类视觉的过程,从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备视觉感知和理解的能力,使其能够从视

    2024年02月07日
    浏览(52)
  • 什么是计算机视觉,计算机视觉的主要任务及应用

    目录 1. 什么是计算机视觉 2. 计算机视觉的主要任务及应用 2.1 图像分类 2.1.1 图像分类的主要流程 2.2 目标检测 2.2.1 目标检测的主要流程 2.3 图像分割 2.3.1 图像分割的主要流程 2.4 人脸识别 2.4.1 人脸识别的主要流程 对于我们人类来说,要想认出身边的一个人,首先需要

    2024年02月11日
    浏览(43)
  • 什么是计算机蠕虫?

      计算机蠕虫的诞生与计算机网络的发展密切相关。20世纪60年代末和70年代初,互联网还处于早期阶段,存在着相对较少的计算机和网络连接。然而,随着计算机技术的进步和互联网的普及,计算机网络得以迅速扩张,连接的计算机数量也急剧增加。 这种广泛的网络连通性为

    2024年02月10日
    浏览(38)
  • 什么是虚拟计算机集群

            这个问题来自近期几位网友的私信,他们不约而同问到一个问题:什么是虚拟计算机集群?Laxcus分布式操作系统是如何做的?下面就正式回答一下这个问题。         在我们传统的认知里,或者大家平常比较多接触的,都是基于单机系统的虚拟化。比如VMWare,

    2024年02月02日
    浏览(35)
  • 为什么计算机对浮点型数字计算存在误差

    我们输入的十进制小数在计算机中都是以二进制进行存储。比如: 由此可见0.3在计算机中存储的值永远小于0.3,所以当使用0.3计算时,就会产生误差。 在计算机中浮点型不能直接使用等号比较也是同一个道理。举个李子: 执行结果: 可以看出当涉及到0.3的运算超出一定的精

    2023年04月11日
    浏览(47)
  • 计算机视觉有什么发展方向

    计算机视觉主要涵盖了图像处理、模式识别等多个领域,可以应用到很多行业中。随着人工智能技术的快速发展,计算机视觉作为其中的重要分支之一,其就业前景非常广阔,所以说计算机视觉有很好的发展方向。 计算机视觉(Computer Vision)是一门研究如何让计算机能够理解

    2024年01月23日
    浏览(55)
  • 计算机专业学习的核心是什么?

    既然是学习CS,那么在这里,我粗浅的把计算机编程领域的知识分为三个部分: 基础知识 特定领域知识 框架和开发技能 基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。 特定领域知识就是你从事某个细分方向时需要掌握的知识,

    2024年02月07日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包