c - 理解定点位模型

c - understanding fixed point bit model

所以我正在学习二进制值,并试图了解如何使用定点位模型计算数字的负数。

在我的教科书中它说 000111.01 = 7.25 我理解。但它告诉我 -7.25 是 111000.11,我不明白这是怎么可能的。

我知道它使用二进制补码规则翻转所有位并在末尾添加 1。但是如果我做了计算:(1 * 2^5) + ( 1 * 2^4) + (1 & 2^3) + 0 + 0 + 0 + (1 * 2^-1) + ( 1 * 2 ^-2) 它给了我 56.75。

我尝试在网上查找教程,但仍然无法弄清楚为什么-7.25 是 111000.11。如果有人能解释得到 -7.25 背后的数学过程,我将不胜感激。

您有一个带符号的 8 位 6Q2 格式定点表示,分辨率为 2-2(或 0.25)。你可以纯算术地看这个:

11100011 的 int8_t 值为 -29,但使用定点缩放后为 -29 x 0.25 = -7.25。

或者根据 2 的补码位值,对于 8 位 整数 是:

-27 (-12810)
26 (6410)
25 (3210)
24 (1610)
23 (810)
22 (410)
21 (210)
20 (110)

但是 Q2 定点将这些位值移动 2,如下所示:

-25 (-3210)
24 (1610)
23 (810)
22 (410)
21 (210)
20 (110)
2-1 (0.510)
2-2 (0.2510)

I know it's using the two's complement rule where it flips all the bits and adds a 1 at the end.

在二进制小数点向左移动两个位置的比例因子下,您需要修改规则:翻转所有位并添加 1/4,即 0.01。

000111.01 = 7.25

翻转所有位:

111000.10

添加0.01:

111000.11

定点约定所做的只是移动二进制小数点。如果我们将 111000.11 乘以 4(并截断以保持在 8 位以内),我们得到 100011.00。那是-29。恰好是 -7.25 的四倍。因此,如果我们 29 除以 4,则过程必须反转并从 100011.00 变为 111000.11。这只是一个算术右移sign extension的过程是从高位开始补1,其他位只是向下移动。我们最终得到 .11.

当然,这里我说 "divide by 4" 的意思是除以常规整数 4,而不是缩放后的 4 = 100.00。在定点下,我们可以使用规则的、不调整的乘法和除法将一个固定的操作数与一个规则的操作数组合起来。 FIXED x INT -> FIXED 仅使用常规乘法。 FIXED + FIXED -> FIXED 使用常规加法。 FIXED x FIXED -> FIXED 需要重新归一化。 FIXED + INT -> FIXED 需要将 INT 转换为 FIXED。