为不同的十进制值形成16位带符号的二进制补码

时间:2019-05-15 21:46:59

标签: binary bit-manipulation twos-complement

我一直在尝试将不同的值(大多数为小数)转换为2的补码格式。我似乎对它们有麻烦,尤其是分数。

让我们说我有一个整数L = 2 ^ 16-46,我想将其转换为2的补数。

L = 65490,这似乎给了我1111111111010010的二进制格式。 然后,我通过交换位并加一个将其转换为2的补码,从而得到L(2's = 0000000000101110.

现在假设我有一个带分数的小数,例如K = 0.2522429。将其转换为二进制,得到0.01000000_10010011。再次以2的补数进行转换,最终得到0.10111111_01101101,这似乎是正确的。

但是,如果小数位数与16位不匹配怎么办?或者,如果我想对操作K / 16使用2的补码?

我将得到K = 0.01576518125,这将导致二进制格式为0.00000100_00001001_0011。如我们所见,我们现在有20位而不是6位,而2的补码将是0.1111_10111111_01101101。对于操作K / 16,如何获得16位结果,例如-K / 8,K / 4,-K / 2等不同变体?

1 个答案:

答案 0 :(得分:0)

  

让我们说我有一个整数L = 2 ^ 16-46,我想将其转换为2的补数。

如果要对2的补码中的数字N进行编码,则必须确保-2 ^15≤N≤2^ 15-1,并且不能在2的补码中将数字2 ^ 16-46编码为正数。 16位。更准确地说,2 ^ 16-46将是(正)数字,其二进制代码将用于在2的C中以16位表示负数-46。

  

现在假设我有一个带分数的小数,例如K = 0.2522429。将其转换为二进制,得到0.01000000_10010011。再次以2的补数进行转换,最终得到0.10111111_01101101,这似乎是正确的。

不是。 N = 0.01000000_10010011的2的C为N'= 1.10111111_01101101(或在16位N = 0.01000000_1001001和N'= 1.10111111_0110110)上。历史上,N的2的C和2的C的第一个应用的分数是数N',例如N + N'= 2。换句话说,N'是必须加到N以获得2的数字,因此是2的补码的名称。

  

但是,如果小数位数与16位不匹配怎么办?

我不太了解您的问题。 K = 0.2522429已经不能准确地在16位上编码,并且0.01000000_10010011 b = 0.252243042,并且由于分数数字很常见,因此只能对这些数字进行二进制近似。小数小数表示为10的负幂之和,并且在大多数情况下,其值不能精确表示为2的负幂之和(因为1/3不能精确表示为10的负幂之和)。

因此,如果要在16位上编码小数,则可以找到该数字的二进制近似值,而仅保留16位。

  

或者我想对操作K / 16使用2的补码吗?

除以16将右移4。对于2s C数,该移位必须是算术运算,并且MSB(符号位)必须重复。这将确保这等于除以4。因此,如果N'= 1.10111111_01101101,则N'/ 4 = 1.1111_10111111_01101101。当然,位数大于16,并且必须仅保留16个最高有效位N'= 1.11111011_1111011,该值等于-0,015777588,这是结果的近似值。

但是由于除法运算,并且对于任何基数和具有有限位数的编码系统中的任何数字均相同。例如53 = 00110101,如果只在该点的右边保留8位数字,则编码为整数53/16 = 00000011或0.12325621 / 100 = 0.00123156。