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

What exactly means U0.8, U4.8, U12.8, S0.4, S4.4, S12.4, U8.8 etc. fixed-point representation?

本文关键字:表示 是什么 意思 究竟 S12 U12 U4 S0 S4 U0 U8      更新时间:2023-10-16

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

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

我该怎么做?

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

谢谢

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

举一个简单的例子。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 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 数字的精度。这被称为"运气不好"。您也可以将这两个数字提升到更高的表示形式,有各种各样的选择。