程序员的数学基础课
黄申
LinkedIn 资深数据科学家
83374 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
导读 (1讲)
基础思想篇 (18讲)
程序员的数学基础课
15
15
1.0x
00:00/00:00
登录|注册

数学专栏课外加餐(一) | 我们为什么需要反码和补码?

补码
反码
原码
溢出后的影响
下溢出
上溢出
无符号数
有符号数
二进制的原码、反码及补码
溢出
符号位
为什么需要反码和补码
文章主题

该思维导图由 AI 生成,仅供参考

你好,我是黄申。欢迎来到第一次课外加餐时间。
专栏已经更新了几讲,看到这么多人在留言区写下自己的疑惑和观点,我非常开心。很多同学在留言里提出了很多非常好的问题,所以我决定每隔一段时间,对留言里的疑问、有代表性的问题做个集中的解答,也是对我们主线内容做一个补充,希望对你有帮助。

什么是符号位?为什么要有符号位?

第 1 讲里,我介绍了十进制数转二进制数。这里面很多人对逻辑右移和算术右移中提到的符号位和补码有疑惑。这里面涉及了几个重要的概念,包括符号位、溢出、原码、反码和补码。我详细讲一下这几个点的来龙去脉。
首先我们来看,什么是符号位,为什么要有符号位?用一句话来概括就是,符号位是有符号二进制数中的最高位,我们需要它来表示负数。
在实际的硬件系统中,计算机 CPU 的运算器只实现了加法器,而没有实现减法器。那么计算机如何做减法呢?我们可以通过加上一个负数来达到这个目的。比如,3-2 可以看作 3+(-2)。因此,负数的表示对于计算机中的二进制减法至关重要。
那么,接下来的问题就是,如何让计算机理解哪些是正数,哪些是负数呢?为此,人们把二进制数分为有符号数(signed)和无符号数(unsigned)。
如果是有符号数,那么最高位就是符号位。当符号位为 0 时,表示该数值为正数;当符号位为 1 时,表示该数值为负数。例如一个 8 位的有符号位二进制数 10100010,最高位是 1,这就表示它是一个负数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

计算机中的二进制数表示涉及符号位、溢出、原码、反码和补码等重要概念。符号位用于表示正负数,而溢出则是计算机数据类型的一种局限性。原码是二进制的原始表示,而反码和补码则是为了解决负数的加法问题而引入的。通过补码,计算机可以正确地运算二进制减法。这些概念对于理解计算机中的二进制运算非常重要。文章通过具体的例子和图示,生动地解释了这些概念的应用和意义。读者可以通过本文了解到二进制数的表示方式及其运算规则,从而更好地理解计算机中的数据处理过程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(102)

  • 最新
  • 精选
  • 奔跑的蜗牛
    置顶
    疑问1:为什么i-j得加上取模的除数? 疑问2:2^n-1就是32位1,这个地方就又没有符号位之说了? 疑问3:非符号位计算溢出会进到符号位嘛? 麻烦老师帮忙解答下

    作者回复: 我分别来回答一下 疑问1:这个还是要回到计算机只有累加器、没有累减器的本质。因为只有累加器,那么我们如何才能实现减法呢?人们巧妙的利用了计算机的数值是有范围的(无法表示无穷大),从而通过加法来实现减法。核心思想就是通过加上一个取模的除数,这样(-j)+取模的除数正好形成了溢出,达到了减法的效果 疑问2:我们只考虑(n-1)位的1,不考虑第一位 疑问3:这取决于数据是有符号还是无符号的,如果是无符号的数据类型就不存在这个问题。如果是有符号的数据类型,非符号位可能溢出到符号位,这也是为什么对于有符号的数据类型,过大的数据反而会变成负数。

    2019-04-27
    5
  • 梓航(﹏)
    老师,你讲的那个取模和反码的关系那一段我看不懂,之前看书也没有遇到你说的这种概念,请问还有其他学习资料吗?

    作者回复: 其他的材料一般都没有将“为什么”这么算说清楚,我画了张图,你结合图来理解。简单的说,你可以认为a-b的减法就是给a加上一个特别大的数,导致溢出,然后剩下的反而比a小,这就达到了减法的目的

    2018-12-24
    31
  • 随欣所遇
    用大家熟悉的一周七天进行对比吧 1、计算数据的溢出相当于模:假设第1天为周一,第2天为周二,以此类推第7天为周日,第8天已经大于7溢出了,8对7进行取模为1,也即第八天为周一;取模的除数为上限减去下限+1,替换过来换算:一周的上限为7,下限为1,那一周取模的除数换算为:7-1+1,所以我们想要知道第15天后是周几直接对(7-1+1)取模即可; 2、i-j=(i-j)+(2^n-1+1)=i+(2^n-1-j),可以换算为 周一 = (周一)+ (7-1+1)进行理解(ps:不一定周一,周几都为同一样,只是将 i-j 看成一个单元用其做概念上的替换)

    作者回复: 是的

    2019-04-12
    2
    22
  • 石佳佳_Gemtra
    思考题: 原码:10100010 对补码除符号位取反得 反码:11011101 +1操作得 补码:11011110 对应十进制数:-94 还有一种方法,把负数原码除符号位外求和,减去 (2^n-1+1),即 2+32-(2^7-1+1)=-94

    作者回复: 是的

    2018-12-24
    4
    19
  • 风轨
    思考题 0b10100010 = 0b10000000 + 0b00100010 其中 0b10000000 = -128 0b00100010 = 34 所以答案是 -94 2进制取相反数公式 相反数 = 原数减一再取反 - 0b10100010 = !(0b10100010-1) = 0b01011110 = 94

    作者回复: 是的

    2018-12-24
    12
  • 补码代码的数值的快速求法 负数补码通过非符号位0出现的位置来计算,然后计算结果加1,最后带上符号即可。 比如 1000,非符号位为000,按照0出现的位置计算,000=2^2+2^1+2^0=4+2+1=7,结果加上1后得到8,所以这个二进制数 表示-8 正数补码看非符号位1出现的位置来计算,然后加上符号即可。 比如 0111,非符号位为111,按照1出现的位置计算,111=4+2+1=7 所以这个二进制数 表示+7 对补码的理解: 目的:为了使用相同电路来实现加减运算,使得计算机cpu设计更加容易 为何用补码,可以通过如下四位数模拟补码从0开始一直加1的情况 0000 = 0 0001 = 1 0010 = 2 0011 = 3 0100 = 4 0101 = 5 0110 = 6 0111 = 7 1000 = -8 1001 = -7 1010 = -6 1011 = -5 1100 = -4 1101 = -3 1110 = -2 1111 = -1 0000 = 0 (再加1又从0开始了,上面表示的不同数值的个数是2^4=16,所以模是16) ... 然后上溢和下溢也顺便理解了,如下所示, 上溢就是4位二进制数的正数的最大值加1,然后通过补码加法运算后结果是4位二进制数的最小数-8 上溢:7 + 1 =0111+0001=1000(4位二进制数的最小数)=-8 注:加上1的目的是最大值再大一点,当然就溢出了 下溢就是4位二进制数的负数的最小值加-1,然后通过补码加法运算后结果是4位二进制数的最大数+7 下溢:-8+(-1)=1000+1111=0111(最大数)=7 注:加上-1的目的是最小值再小一点,当然就溢出了

    作者回复: 很详细的解释

    2019-06-18
    7
  • Temme
    思考题:10100010 如果是原码,所对应的数字就是-34 如果是补码,那么就减一取反求原码,11011110,就是-94。 然而对着补码再去求一次补码也可以得出原码,所以神奇的是某个回答也是对的。。。这就是所谓的互为补码。

    作者回复: 对的,负负得正的原理

    2019-06-19
    6
  • 彩色的沙漠
    老师,不好意思 问题有一处错误,我纠正一下,以免误导后来的同学 java中int的最小值是-2^31 二进制源码:1 000 0000 0000 0000 0000 0000 0000 0000 二进制反码:1 111 1111 1111 1111 1111 1111 1111 1111 -2^31的补码还是自己,符号位进位舍弃

    作者回复: 是的👍

    2018-12-26
    6
  • 夏飞
    这不就是余数和取模的概念吗? 这句话不明其意

    作者回复: 可以将问题简化一下,假设计算机的数据类型只有正数,而超过100就溢出了,那么102就好比2。这就好比对100取模,2和102的余数是一样的

    2018-12-25
    5
  • 爱吃锅巴的沐泡
    老师,请教一下问题 文章中讲的是原码到补码的推导过程。 一个二进制数在计算机中存储的形式就是补码。 那么一个数输入到计算机中就是补码形式,还是说有一个从原码到补码的推导过程?可是这个推导过程中也有减法,和补码把减法加法化的说法就冲突了?

    作者回复: 计算机存储的就是补码,这个推导过程是便于人的理解

    2019-06-26
    4
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部