
short 是整数,float 是小数,根本不是一类东西
别被“都占 2 字节或 4 字节”误导——short 存的是精确的整数,比如 -32768 到 32767;float 存的是近似的小数,靠 IEEE 754 编码,哪怕写 0.1f,内存里也不是真 0.1。它们的二进制布局、运算规则、溢出行为全都不兼容。
sizeof(short) 通常是 2,sizeof(float) 固定是 4
标准只要求 short ≥ 16 位、float ≥ 32 位,但几乎所有现代平台(x86/x64/ARM)上:short 占 2 字节,float 占 4 字节。你可以用 static_assert(sizeof(short) == 2) 和 static_assert(sizeof(float) == 4) 在编译期确认,别靠文档猜。
- 赋值时隐式转换会丢精度:把大
int赋给short可能截断;把double常量赋给float会四舍五入(如3.1415926535→3.1415927) - 比较要小心:
short a = 10000; float b = 10000.0f;,a == b成立;但short a = 16777217;就超出float的精确整数范围(2³² > 2²⁴),此时(float)a == a可能为false
别拿 short 当“省内存的 float”,也别用 float 存计数器
常见误用场景:
- 想省空间,把温度传感器读数(带小数)强行塞进
short:比如放大 10 倍存成short temp_x10 = 255;→ 实际是 25.5℃,但一做加减乘除就容易溢出,且无法表示 0.01℃ 级别变化 - 用
float count = 0.0f;当循环变量:浮点数累加有误差,for (float i = 0.0f; i != 10.0f; i += 0.1f)可能永远停不下来 - 跨平台序列化时混用:
short的字节序和float的 IEEE 表示虽都依赖平台,但前者无符号扩展规则、后者有 NaN/Inf 特殊值,直接 memcpy 会出错
什么时候该选 short,什么时候必须用 float
short 合适场景:确定范围小、无需小数、对内存敏感,比如音频采样(16-bit PCM)、游戏网格索引、嵌入式 GPIO 状态位组。
立即学习“C++免费学习笔记(深入)”;
float 合适场景:必须支持小数、参与数学计算、与 GPU/数学库交互,比如物理引擎速度、OpenGL 顶点坐标、滤波器系数。
- 不确定用哪个?优先选
int(比short更安全)或double(比float更准),除非 profiling 明确指出内存或缓存是瓶颈 - 需要高精度小数又怕 float 误差?考虑
int64_t存“微秒”或“万分之一单位”,用定点运算 - 函数参数类型别妥协:如果 API 明确要
float*(如glVertexAttribPointer),传short*强转不仅 UB,还会让 GPU 读错数据
short 的符号性默认是有符号的,而 float 根本没有“无符号”概念——它天生就能表示负数,但不能表示大于 2²⁴ 的精确整数。这点在做数据压缩或协议解析时,一不留神就解错。**










