我对这个有点迷惑。我需要使用两个小数位0.(a-1)(a-2)
就像这样,现在我可以使用.00 .01 .10和.11,但我也需要负数(在2的补码中),那么.10会是-.5吗?或者它会是-.25?和.11一样,那就是-.75吗?或者它会是-.5?我很确定在这两种情况下都会是前者,但我并不完全肯定。
发布于 2012-03-30 23:51:26
在二的补码表示法中,负数的所有最高有效位都被设置为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发布于 2012-03-31 00:09:24
这样看吧:
你有正常的二进制表示
让我们假设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))
发布于 2012-03-30 23:49:15
存储在二的补码中的数字反转最高位的大小的符号(例如,对于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位数。
https://stackoverflow.com/questions/9946183
复制相似问题