负定点数表示

Negative fixed point number representation

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

对于正数,处理很简单,但是当事情变成负数时,我发现了不同的来源。 Someone says there is a single bit used to hold the sign while others 说整数应该用 2 的补码表示为伪整数,即使它是负数。

谁能告诉我哪个来源是正确的,或者有符号定点数的标准表示吗?

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

定点数只是二进制值,其中 位值 已更改。为位分配位值是人类的任意行为 activity,我们可以以任何有意义的方式进行。通常我们说的是二进制整数所以很方便把位值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)的幂。要从实数值转换为整数表示,请乘以该比例。要再次转换回来,只需除以即可。然后,如何表示负值的问题就变成了表示数字的整数类型的细节。

Please anyone tell me which source is correct...

两者都有问题。

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

the same as 2's complement numbers.

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

你的第二个 source 可能有点误导......

shifting the bit pattern of a number to the right by 1 bit always divide the number by 2.

这条语句忽略了LSB(最低有效位)设置为1时发生的下溢问题,以及由此产生的舍入。右移通常导致向负无穷大舍入,而除法导致向零舍入(截断)。两者对正数产生相同的行为:3/2 == 1 and 3>>1 == 1. For negative numbers, they are contrary: -3/2 == -1 but -3>>1 == -2.

...is there a standard representation for signed fixed point numbers?

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

Additionally, if the 2's complement representation was correct then how to represent negative numbers with zero integer part. For example -0.125?

这取决于您的整数格式和您选择的基数。假设一个 16 位二进制补码表示二进制定点值,则比例因子为 2^1532,768。将要存储为整数的值相乘:-0.125*32768. == -4096 and divide to retrieve it: -4096/32768. == -0.125.