1

我发现很难理解定点表示。当我有无符号类型的数据 (C++) 并且我想处理该数字时,就好像它是定点的一样,我需要做一些我不清楚的位操作。

所以假设我希望我的无符号数字可以是最大 255(8 位数字)以 U4.4 或 U12.8 或 S13.8 或任何一种表示法(U - 无符号,S - 有符号)表示,它来了当我的号码是 int 时有问题)。基本上我正在扩展(或者我希望我是)这个数字,处理它,然后将它返回到以前的状态。

我怎么做?

有人可以分享链接,我可以在其中找到与此主题密切相关的内容。我找了三个小时,我发现的只是定点算术的一般解释,没有什么很实用的。

谢谢

4

1 回答 1

5

它告诉您小数点的每一侧使用了多少位。

举一个简单的例子。2 个字节,16 位。

那很容易是U8.8。也就是说,高字节是“整数”部分,低字节是“小数”部分。

因此,让我们将其作为解释变得更容易一些。

考虑二进制编码的十进制。这就是你将十进制数字编码为字节的地方,每个字节是 2 位。每个半字节都是一个十进制数字,所以 1001 0010 是“92”。有两个字节,1001 0010 0100 0111 是 9287。

因此,您可以看到没有分数的情况下,16 位如何表示 0000 到 9999。使用您的符号,这可能是 U16.0。

现在,您可以看看我们是否逻辑地将小数点放在中间,现在我们可以有 00.00 到 99.99 或 U8.8。

底层的位模式是相同的,这完全取决于您在逻辑上放置小数点的位置。

现在,在这个例子中,你看到了小数点之间的小数点。

如果您使用二进制表示,则“小数”点位于二进制数字之间。

所以,U8.8 us 11111111. 11111111,U12.4就是11111111 1111.1111

S vs U 告诉您有关符号位的信息。因此,您将拥有 S7.8 而不是 U8.8 S1111111. 11111111

当您有类似表示的数字时,那么它只是二进制数学,就像任何其他数字(如整数)一样。当您将数字转换为 ascii 时,或者将其与您需要转换的其他表示结合起来。

例如。要将 U8.8 添加到 U12.4,您需要在执行数学运算之前将 U8.8 转换为 U12.4。

因此,11111111. 11111111只需要右移 4 个位置即可成为00001111 1111.1111. 然后你可以像往常一样处理两个 12.4 数字。您会注意到在转换过程中您失去了 8.8 数字的精度。这被称为“运气不好”。您还可以将这两个数字提升到更高的代表,有各种各样的选择。

于 2013-10-24T16:20:20.307 回答