深入理解补码

您所在的位置:网站首页 补码相加规则怎么写的图片 深入理解补码

深入理解补码

2024-07-17 12:36| 来源: 网络整理| 查看: 265

补码黑历史

对于每个计算机专业的同学,刚开始都会接触到二进制转换、原码、反码、补码的知识。

国内教材上是如下定义的:

原码:最高位为符号位,0代表整数,1代表复数,非符号位为改数字绝对值的二进制表示。如127的原码为 0111 1111,-127的原码为 1111 1111。

反码:正数的反码与原码一致;负数的反码是对原码按位取反(符号位不变)。如127的反码为 0111 1111,-127的反码为 1000 0000。

补码:正数的补码与原码一致;负数的补码是该数的反码加1。如127的补码为 0111 1111,-127的补码为 1000 0001。

记住上述的定义和转换方法,通过考试so easy。可是,如果做个有心人,难免会有两点疑惑:1)为什么负数和正数的规则会不同,这和我们学习其他概念方式差别很大;2)补码到底有什么用,引入补码本质是为了解决什么问题?

带着上面的疑问,对比下国外的计算机教材的讲解,国内的教材只写结论,对技术产生的背景几乎完全忽略,实际上是本末倒置。如果理解了补码背景,彻底理解补码并不太难。

为什么需要补码

补码是一个工程问题,它是为解决特定工程问题而引入的。

对于8比特的二进制编码,最多可以表示256个不同的值,如果没有负数,我们可以用来表示0~255,如果有负数,我们可以分别表示-128~127。

计算机应该如何表示负数呢?

以4比特二进制数为例,最多可以表示16个数,如下表,我们至少有三种方式表示负数:

偏移码:

我们以二进制最大值1111对应十进制最大值8,二进制最小值0000对应十进制最小值-7,中间编码进行线性对齐。

符号码:

符号码更直观,固定使用最高位表示符号,0表示正数,1表示负数,非符号位的二进制数值为要表达数字的绝对值。这种编码相对更直观,但是存在0和-0,所以表示范围要少一个。

补码:

0000表示0,以0为中心,依次向上是每个数加1(1 = 0001、2 = 0010、3 = 0011);依次向下,每个数字减1(因为只有4位,减法操作时向上借位),-1 = 0000 - 1 = 1111, -2 = 1111 - 1 = 1110, -3 = 1110 - 1 = 1101。

对比上述三种编码优劣,偏移码和符号码对我们理解起来很容易,但是对硬件设计却是个难题。对于A = B + C,硬件设计者需要理解B和C每一位代表的意义,设计规则相对复杂,而对于补码,则非常自然,只存在一个规则。

特别需要指出的,计算机内部,并没有设计减法器,对于A = B - C,编译器会将其转换成 A = B + (-C),加入C是整数,B - C在计算机内部,是直接B的补码和C的补码相加。

补码对我们来说,比较难理解,为方便换算,人们总结出上一节补码的转换方法,也就是我们在学习时记住的结论。

补码的数学原理

我们继续回到人类的世界,还是按10进制举例,加入只有1位10进制,一共可以表示0个编码,可以表示为0~9,也可以表示-5~4。

按补码思路,对应的补码, -5 = 5,-4 = 6, -3 = 7, -2 = 8, -1 = 9 , 0 = 0, 1 = 1, 2 = 2, 3 = 3, 4 = 4。

如果计算 4 + (-2),4 + (-2) = 4 + 10 - 2 = 4 + 8 = 12 = 2。

实际上,补码是向高位借了一位,然后和当前数值进行求和计算,由于计算机位数有限制,会进行截取,所以高位接过来的一位对要计算的数值结果并无影响。

在只能表示一位的10进制里,A = B + C 、A = (10 + B) + C 、A = B + (10 + C)、 A = (10 + B) + (10 + C)结果是相同的,如果是负数,和10进行结合后的结果就是补码。

 

 

 

 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3