如何在固定类型和浮动类型之间手动转换?

How to manually convert between fixed type and floating type?

我正在使用一个库,它有 不动点 variables.The 库叫做 libfixmath.

我正在尝试查看数字如何从 fix16_t 转换为浮点类型。我知道它使用 32 位(16 位 MSB 位表示整数,16 位 LSB 位表示小数)来表示一个数字。

这是我试过的代码,这里"sum"的类型是fix16_t。

float in_sum = fix16_to_float(sum);
printf("fix16 type sum:%u\n",sum);
printf("float type sum:%f\n",in_sum);

我以无符号整数格式显示 "sum",我再次不确定显示 "sum" 值的最佳格式。

我得到的示例输出是:

fix16 type sum:4064807395
float type sum:-3511.961426

我看了一下转换函数:

static inline float   fix16_to_float(fix16_t a) { return (float)a / fix16_one; }

其中 fix16_one 为 65536。

为了更好地理解,我希望能够手动转换它,但我不知道如何操作。我对类型转换感到困惑 (float)a

我的另一个问题是,16 个整数位是有符号的还是无符号的?

如果 fix16_t 是整数类型,那么 a / 65536 将是 整数 除法,没有任何小数。例如65535 / 65536不是浮点值0.99998,而是整数值0.

a 的转换将 a 和整个表达式转换为带小数的浮点除法。


使用值:

  1. 整数除法:-230159901 / 65536 将得到 整数 -3511.
  2. 浮点除法:(float)-230159901 / 65536 将得到 float-3511.961426