U0.8、U4.8、U12.8、S0.4、S4.4、S12.4、U8.8等定点表示到底是什么意思?

问题描述 投票:0回答:1

我发现很难理解定点表示。当我有无符号数据类型(C++)并且我想像定点一样使用该数字时,我需要进行一定量的位操作,但我不清楚。

所以假设我希望我的数字是无符号的,最大可以是 255 (8 位数字)以 U4.4 或 U12.8 或 S13.8 或任何符号(U - 无符号,S - 有符号,并且它当我的号码是 int 时就会出现问题)。基本上我正在扩展(或者我希望我是)这个数字,对其进行处理,然后将其返回到之前的状态。

我该怎么做?

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

谢谢

c++ fixed-point
1个回答
5
投票

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

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

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

所以,让我们把这个解释得更简单一些。

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

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

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

底层的位模式是相同的,这只是你逻辑上把小数点放在哪里的问题。

现在,在这个示例中,您看到了小数位之间的小数点。

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

所以,U8.8我们

11111111. 11111111
,U12.4是
11111111 1111.1111

S 与 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 数字的精度。这被称为“运气不好”。您还可以将这两个数字提升到更高的表示形式,有各种各样的选项。

© www.soinside.com 2019 - 2024. All rights reserved.