负定点数表示

我正在编写一个通用例程,用于在十进制和二进制表示形式之间转换定点数。

对于正数,处理很简单,但是当结果变为负数时,我发现了不同的来源。 Someone表示有一个用于保留符号的位,而others表示整数应使用2的补码以伪整数表示,即使它是负数。

请任何人告诉我哪个来源是正确的,或者是否有标准的表示定点数字的表示形式?

此外,如果2的补码表示正确,那么如何用零整数部分表示负数。例如-0.125

MztKid 回答:负定点数表示

定点数只是更改了位置值的二进制值。为位分配位值是人类的任意行为,我们可以通过任何有意义的方式来实现。通常我们讨论二进制 integers ,因此将位置值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),有符号数字的为-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,以注意哪些位是分数,哪些位是整数。

我们使用这种方法的原因是普通的整数算术运算符仍然可以工作。

,

最容易将定点数视为可缩放的整数,而不是可移位的整数。对于给定的定点类型,有一个固定的 scale ,它是2(或10)的幂。要将实数值转换为整数表示,请乘以该比例。要再次转换,只需分开即可。然后,如何表示负值的问题就变成了代表数字的整数类型的细节。

请任何人告诉我哪个来源是正确的...

两个都有问题。

您的第一个source不正确。给定的示例是 not ...

与2的补码相同。

在两个补码中,MSB(最高有效位)的权重被取反,而其他位仍贡献正值。因此,所有位都设置为1的二进制补码不会产生最小值。

您的第二个source可能会引起误解,显示为...

将数字的位模式向右移动1位总是将数字除以2。

此语句清除了当LSB(最低有效位)设置为1时发生的下溢问题,以及由此产生的舍入。右移通常会导致向负无穷大舍入,而除法会导致向零舍入(截断)。两者对于正数产生相同的行为:3/2 == 13>>1 == 1。对于负数,它们相反:-3/2 == -1-3>>1 == -2

...有没有固定点号的标准表示形式?

我不这么认为。有特定于语言的标准,例如ISO / IEC TR 18037(draft)。但是,已经很好地建立了将整数缩放为预定范围和分辨率的近似实数的惯例。基础整数的表示方式是另一回事。

此外,如果2的补码表示正确,那么如何用零整数部分表示负数。例如-0.125?

这取决于整数的格式和基数的选择。假设一个16位二进制补码表示二进制定点值,则缩放因子为2^15,即32,768。将该值乘以存储为整数-0.125*32768. == -4096并除以检索它:-4096/32768. == -0.125

本文链接:https://www.f2er.com/2546803.html

大家都在问