short在绝大多数现代系统上是16位有符号整数,范围-32768至32767;C++标准仅规定其大小介于char和int之间,嵌入式平台可能为32位;跨平台时应使用int16_t或static_assert校验。

short 在 C++ 里到底能存多大?
它不是固定值,取决于编译器和平台,但绝大多数现代系统(x86/x64、ARM64)上,short 是 16 位有符号整数,范围是 -32768 到 32767。
这个范围来自二进制补码表示:16 位中最高位是符号位,剩下 15 位表示数值,所以最大正数是 2¹⁵ − 1 = 32767。
别硬记数字——记住“16 位有符号”这个本质,就能随时推出来。
为什么 sizeof(short) 有时不是 2?
sizeof(short) 只保证 ≥ sizeof(char) 且 ≤ sizeof(int),C++ 标准只规定了相对大小关系,没锁死字节数。
立即学习“C++免费学习笔记(深入)”;
实际中极少见,但某些嵌入式平台(比如 TI C2000 系列 DSP)会把 short 设为 32 位,这时它的范围就变成 -2147483648 到 2147483647。
如果你写的代码要跨平台(尤其进嵌入式或老系统),别假设 short 一定是 16 位:
- 用
static_assert(sizeof(short) == 2, "short expected to be 16-bit")做编译期检查 - 需要确定宽度时,优先用
int16_t(需#include <cstdint>) -
short不等于“小整数优化”——它不比int更省内存(对齐可能让结构体反而更大)
short 和 int 混用时的隐式转换陷阱
当你把 short 当参数传给函数、做算术运算、或赋值给 int,它会自动提升为 int(整型提升规则)。这本身没问题,但容易掩盖溢出问题。
比如:
short a = 32767; short b = a + 1; // 编译不报错,但结果是 -32768(溢出)
更危险的是:
void foo(int x) { /* ... */ }
short s = 32767;
foo(s + 1); // 这里 s 先转 int,再加 1 → 32768,没问题
foo(s * s); // s 先转 int,再平方 → 1073676289,远超 short 范围,但你根本没在 short 上做乘法关键点:
- 溢出发生在
short类型表达式内部(如s = s + 1)才触发未定义行为 - 只要中间结果进了
int,就按int规则算,不会回绕成short - 想检测
short运算溢出?得手动判断,比如if (s > SHRT_MAX - 1) ...
什么时候真该用 short?
基本只在两种场景下值得考虑:
- 和硬件/协议打交道时,对方明确要求 16 位字段(比如 CAN 总线消息、BMP 文件头)
- 内存极度敏感的大数组(比如百万级
short[1000000]比int[1000000]少占 4MB)
其他情况,比如循环计数、临时变量、函数返回值——直接用 int。现代 CPU 对 int 的操作通常不比 short 慢,反而避免了零扩展/符号扩展指令开销。
还有一点常被忽略:std::vector<short> 的迭代器解引用返回 short&,但你在 for-range 循环里写 for (auto x : v),x 是 short 值拷贝;而写 for (int x : v),会先提升再拷贝——语义不同,别想当然。










