首页 > 解决方案 > 二进制 2 的补码

问题描述

我面临一个问题。当我们想使用 2 的补码从另一个数字中减去一个数字时,我们可以这样做。我不知道如何使用 2 的补码减去小数。

5 is in binary form 101 and 2 is 10. if we want to subtract 2 from 5 we need to find out 2's complement of 2 2's complement of 2-> 11111110

因此,如果我们现在将 5 的二进制数相加,我们可以得到减法结果。如果我想得到 5.5-2.125 的结果。程序是什么。

标签: mathbinary

解决方案


可以使用定点数,并且在嵌入式代码或硬件中找到它们仍然很常见。

它们的使用与整数相同,但您需要指定“点”在哪里。例如,假设您在点之后需要 3 位,并且您的数据是 8 位,位 7..3 是整数部分(“点”的左侧),位 2..0 是小数部分。整数部分的解释通常是这个整数的二进制分解:位 3 对应于 2 0,位 4 到 2 1等。

对于小数部分,分解是负幂或二。位 2 对应于 2 -1,位 1 到 2 -2和位 0 到 2 -3

所以对于你的问题,5.5=4+1+1/2=2 2 +2 0 +2 -1它的代码是 00101(.)100。同样 2.125=2+1/8 其代码为 00010(.)001 (注意 (.) 只是帮助理解编码)。

实际上它们只是整数,但您必须考虑到所有数字都乘以 2 -3。这对加法没有影响,但乘法和除法的结果必须调整。考虑点的位置并管理上溢和下溢是定点算术的难点,但即使您的硬件不提供浮点支持(例如低端微控制器或 FPGA 系统),它也允许进行分数计算。

两个补码类似于整数,其计算方式相同。如果 2.125 的代码是 00010(.)001,则比 -2.125==11101(.)111。操作如常。

+5     00101(.)100
-2.125 11101(.)111
       00011(.)011

和 00011(.)011=2+1+1/4+1/8=3,375

为了记录,二补码首先用于定点小数,二补码名称由此而来。如果用 0(.)1100000 (0.75) 表示小数,则其负数部分将为 1(.)0100000(如果解释为无符号则为 -0.75 或 1.25)并且我们总是有 x+(unsigned)-x= 2. 对于这种编码,小数 x 的负值是必须添加到 x 以获得 2 的数字 y,因此名称 y 是 x 的 2 的补码。


推荐阅读