在 C 语言中,fixed_t 通常是一个自定义的类型别名(typedef),用于表示固定点数(Fixed-Point Number),而非 C 语言标准库中的原生类型。它主要用于需要高效实数运算但无法使用浮点数的场景(如嵌入式系统、性能敏感代码)。
核心概念:固定点数(Fixed-Point)
原理
用整数类型(如 int32_t)表示实数,但隐含约定小数点位置。
例如:
若定义 小数部分占 16 位,则数值实际值 = 存储值 / 2¹⁶
存储值 0x00010000(65536)→ 实际值 1.0
存储值 0x00018000(98304)→ 实际值 1.5
优势
性能高:整数运算快于浮点运算(尤其无FPU硬件时)。
确定性:避免浮点精度误差(适用于金融、嵌入式控制)。
内存小:通常用 16/32 位整数存储,比 float/double 更紧凑。
劣势
范围/精度受限:需提前规划整数/小数部分的位数。
手动处理缩放:乘除需显式移位调整小数点位置。
#include <stdint.h>
// 常见定义方式:32位整数,其中16位表示小数部分(Q16.16格式)
typedef int32_t fixed_t;
#define FIXED_SHIFT 16 // 小数部分位数
// 辅助宏(可选)
#define INT_TO_FIXED(x) ((fixed_t)((x) << FIXED_SHIFT)) // 整数转固定点
#define FIXED_TO_INT(x) ((x) >> FIXED_SHIFT) // 固定点取整数部分
#define FLOAT_TO_FIXED(x) ((fixed_t)((x) * (1 << FIXED_SHIFT))) // 浮点转固定点
#define FIXED_TO_FLOAT(x) ((float)(x) / (1 << FIXED_SHIFT)) // 固定点转浮点
// 加法(直接整数相加)
fixed_t a = FLOAT_TO_FIXED(1.5); // a = 0x00018000
fixed_t b = FLOAT_TO_FIXED(2.25); // b = 0x00024000
fixed_t sum = a + b; // sum = 0x0003C000 → 3.75
// 乘法(需移位调整)
fixed_t multiply(fixed_t x, fixed_t y) {
int64_t tmp = (int64_t)x * y; // 防溢出
return (fixed_t)(tmp >> FIXED_SHIFT); // 右移去除多余小数位
}