2 分数的补码表示法?

问题描述 投票:0回答:4

我对此有点迷失。我需要使用两个小数位

0.(a-1)(a-2)

这样,现在我可以使用

.00 .01 .10
.11
但我还需要负数(2 的补码),那么
.10
会是
-.5
吗?或者会是
-.25
? 与
.11
相同,那就是
-.75
?或者会是
-.5
? 我很确定这两种情况都是前者,但我并不完全肯定。

math binary representation
4个回答
5
投票

在二进制补码表示法中,负数的所有最高有效位都设置为 1。假设您将这些数字存储为 8 位,其中 2 位于“二进制点”的右侧。

根据定义,

x + -x = 0
,所以我们可以写:

0.5  +  -0.5 = 0.10 + 111111.10 = 0   // -0.5  = 111111.10
0.25 + -0.25 = 0.01 + 111111.11 = 0   // -0.25 = 111111.11
0.75 + -0.75 = 0.11 + 111111.01 = 0   // -0.75 = 111111.01

等等。

像这样使用8位,你可以存储的最大数字是

011111.11 = 31.75

最小正数是

000000.01 = 0.25

最小负数是

111111.11 = -0.25

最小的(即最负的)是

100000.00 = -32

1
投票

这样看:

你有正常的二进制表示

我们假设 8 位字...

第一位 (MSB) 的值为 128,第二位为 64,依此类推...

换句话说,第一位(MSB)是 2^7 ...第二位是 2^6 ...最后一位是 2^0

现在我们可以假设我们的 8 位字有 2 位小数....

我们现在从第一位 (MSB) 2^5 开始,以最后一位 2^-2 结束

这里没有魔法...

现在将其转换为二进制补码:只需对第一位的值取反

所以不是 2^5 而是 -2^5

所以基数 10 -0.75 将是二进制补码
111111.01 ...
(1*(-32) + 1*16 + 1*8 + 1*4 + 1*2 +1*1 + 0*0.5 + 1*0.25)
(1*(-2^5) + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 +1*2^0 + 0*2^(-1) + 1 *2^(-2))


0
投票

以二进制补码存储的数字会反转最高位大小的符号(因此,对于 16 位数字,最高位是 -32768 而不是 +32768)。所有其他位均表现正常。因此,在对多字数字进行数学运算时,每个数字的高位字应被视为补码(因为其最高位将是整个数字的最高位),但每个数字中的所有其他字应被视为作为无符号数量。

例如,16 位二进制补码具有位值(-32768、16384、8192、4096、2048、1024、512、256、128、64、32、16、8、4、2 和 1)。分成两个 8 位部分,这些部分将具有位值(-32768、16384、8192、4096、2048、1024、512 和 256);和(128、64、32、16、8、4、2 和 1)。第一组值是二进制补码 8 位数字乘以 256;后一组是无符号的 8 位数字。


0
投票

假设您有 2 的补码值,由 1 位符号、5 位整数部分和 2 位小数部分组成。 您还记得可以通过两种方式计算一个值的相反数:1)反转所有位并将 LSB 加 1; 2)复制所有最右边的0(如果有),复制遇到的第一个1(从右到左),反转所有剩余的位。

我们有:

0.25 -> 000000.01 -0.25 -> 111111.11

0.5 -> 000000.10 -0.5 -> 111111.10

0.75 -> 000000.11 -0.75 -> 111111.01

您还可以阅读这个答案:【小数的补码】

© www.soinside.com 2019 - 2024. All rights reserved.