我对此有点失落。我需要使用两个小数位
0.(a-1)(a-2)
就像那样,现在我可以使用.00 .01 .10
和.11
但是我也需要负数(在2的补码中),.10
是-.5
吗?还是-.25
?
与.11
相同,即-.75
?还是-.5
?
我很确定在两种情况下它都会成为前者,但我并不完全正面。
答案 0 :(得分: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 :(得分: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))
答案 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)。第一组值是2的补码8位数,乘以256;后一组是无符号的8位数。