浅谈补码运算在计算机中的应用
1. 原码、反码、补码简单介绍
原始代码、补码和补码是带有一个符号位的有符号数的二进制表示,对应于相同的真值。
原始代码的带符号位被直接读取为真值。
三个正数合二为一。
负数的补码是符号位不变(即保持为1),其余位反相(可以用同样的方法做相反的转换);
负数的补码是符号位保持不变(即保持为1),其余位反相后,最后一位加1(反向转换也可以用同样的方法)。
进一步理解:
原始代码:符号-幅度。以一个典型的8位二进制为例(如不说明,下同),8位可以分为符号位和幅度区,幅度区是最后7位。
反码:一的补码。人们常说,通过否定运算得到反码的方法,本质上是从1的补码推导出来的。-X的补码(X为正整数)等于1111 1111减去X的8位二进制原码表示(注意前1为符号位,可以参与这里的减法运算。因为被减数是正整数的原始代码,所以符号位是0。用1减去这个0,结果是1。因此,不需要从1的最后7位减去X的原始码的最后7位,然后保持第一位为1,但所有8位都可以直接参与减法)。例如-3的补码可以得到如下:1111 1111-0000 0011=1111 1100,与反相运算得到的结果一致(在反相运算的情况下,原码1000 0011符号位保持不变,其余位反相1111 1100)。
补语:二的补语。这里的二是指2 ^ 8的原码,-X (X为正整数),等于2 ^ 8减去X的8位二进制原码表示,即1 ^ 0000 ^ 000减去X的8位二进制原码表示(注意2 ^ 8需要用9位表示,前1参与减法)。很明显,2 ^ 8比1111 ^ 1111大1,和平时取逆加1正好一样(取逆加1可以帮助快速计算;2 8-x有助于理解补码运算是如何工作的)。
2.补码运算是如何生效的
首先有三种操作:正数加正数;加一个正数和一个负数;负数加负数(计算机只做加法,因为如果做减法,电子元器件需要增加成本才能完成相应的物理实现)。只讨论加数、加数、减数和子树的绝对值小于或等于幅度区域最大值的情况,如8位二进制表示中的127。
1.正加相对简单,省略。
2.为了方便,正加负:把上面提到的8位二进制改成了4位二进制(包括第一个符号位),0111=7是可以表示的最大正数。
以结果为正的情况:5-3为例。-3的补码是1 0000-0011=1101。上述操作表明,在1101的基础上加3(即0011),即2 4=16=1 0000,可以完全实现该模块,使最后4位清零。5-3相当于(-3) 5。在加5的过程中,满模块被3清零。为了完成添加5的操作,需要继续添加2。添加2的操作完成后,添加操作完成。只需得到010,即2的补码,5-3=2的运算就在计算机中完成了。
以结果为负的情况:的3-5为例。首先详细描述一下运算过程:5的补码为1 0000-0101=1011,(-5) 3: 1011 0011=1110,1110的第一位数字为1,为负数,其绝对值对应的原码为1 0000-1110=0010,即绝对值为2则为1110。首先获得结果的补码1110。在获取原码对应补码的过程中,使用“1 0000-1110=0010”,对应真值到补码的逆运算。真值的绝对值通过这个表达式得到,真值-2通过将0010的第一个0改为1得到。事实上,如果采用逆加一的方法,可以更快地完成原码和补码的相互转换:所有符号位不变(即保持为1),其余位反相后,最后一位加1,t
“结果为正的情况”与“结果为负的情况”如何统一理解:-A运算,一般来说,相当于用A在模块中挖洞(2 ^ 8=256为8位二进制),然后用B来填充。具体来说,首先取模-A,得到-A的补码,其符号位为1。然后开始添加B(1)如果B小于A,则模块无法填充。-A的补码与B相加后,相加结果小于1 0000,即小于等于1111,符号位保持1,仍为负。但加法运算使模数更接近填充,运算结果对应的真值绝对值更接近0,负数更少为负数。而b越大,结果越不负,因为1 0000-(-A的补码加b)对应的是结果绝对值的真值,b越大,结果真值的绝对值越小。考虑到结果是负面的,就没那么负面了。(2)如果
B大于A,那么模将填满,-A的补码加上B后,相加结果大于1 0000,即大于1111,满模溢出,使得符号位由1变为0,从而使运算结果变为正数,此时B越大,运算结果所对应的真值作为一个正数其绝对值越大;(3)可以看到,利用补码进行运算,并令符号位参与运算,能够:满模溢出时符号位变号,使得结果从负变为正;随B的增大,运算结果的绝对值先减小再增大;这符合数学认知。
3.负加负:1xxx + 1xxx的结果必然溢出,且结果是1 0xxx还是1 1xxx中的一种,前者表示无溢出,后者表示有溢出。至于计算机识别、处理溢出的细节和负加负运算的细节,没弄明白,故不讨论
3.利用原码、反码进行运算的劣势
(此处图片,截取于参考资料1)
参考资料:
1. 为什么计算机采用补码而不是原码或反码 - 醉卧沙场的回答 - 知乎 https://www.zhihu.com/question/352057791/answer/876413629
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/135153.html