我正在编写一个通用例程,用于在十进制和二进制表示之间转换定点数。
对于正数,处理很简单,但是当事情变成负数时,我发现了不同的来源。 Someone表示有一个位用于保存符号,而 others假设整个数字应该用 2 的补码表示为伪整数,即使它是负数。
请告诉我哪个来源是正确的,或者有符号定点数的标准表示形式吗?
另外,如果2的补码表示是正确的,那么如何用零整数部分表示负数。例如-0.125
?
最佳答案
定点数只是位值已更改的二进制值。为位分配位值是一项任意的人类事件,我们可以用任何有意义的方式来完成它。通常我们讨论的是二进制整数,因此可以方便地将位值 2^0 = 1 分配给 LSB,将 2^1=2 分配给 LSB 左侧的位,依此类推。对于 N 位整数,MSB 的位值变为 2^(N-1)。如果我们想要一个二进制补码表示,我们将 MSB 的位值更改为 -2^(N-1),并且所有其他位位值保持不变。
对于定点值,如果我们想让F位代表数字的小数部分,那么LSB的位值就变成2^(0-F) 对于无符号数,MSB 的位值变为 2^(N-1-F),对于有符号数,MSB 的位值变为 -2^(N-1-F)。
那么,我们如何用补码定点值表示 -0.125?这等于 0.875 - 1,因此我们可以使用一种表示形式,其中 MSB 的位值为 -1,所有其他位的值加起来为 0.875。如果您选择一个 具有 3 个小数位的 4 位定点数,您会说 二进制 1111 等于十进制 -0.125。将各个位的位值相加,得到 (-1) + 0.5 + 0.25 + 0.125 = -0.125。我个人喜欢将二进制数写为1.111,以记下哪些位是分数,哪些位是整数。
我们使用这种方法的原因是普通的整数算术运算符仍然有效。
关于binary - 负定点数表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60942450/