short int 至少16位,通常占2字节,但具体大小由编译器和平台决定,唯一可靠方式是用 sizeof(short int) 查询。

short int 在 C++ 里到底占几个字节?
它不固定,取决于编译器和平台,但标准只要求 ≥16 位。常见情况下是 2 字节(即 16 位),可表示范围是 −32768 到 32767(有符号)或 0 到 65535(无符号)。别硬记“就是 2 字节”——sizeof(short int) 才是唯一真相。
容易踩的坑:
- 在嵌入式或旧平台(如某些 DSP)上,
short可能是 32 位;在部分 64 位 Windows MSVC 下仍是 16 位,但 Linux GCC 通常也是 16 位 - 误以为
short比int“一定更小”:在某些平台(如早期 PDP-11 或某些 DSP),int是 16 位,short也是 16 位,二者完全等价
short 和 short int、signed short 有区别吗?
没有运行时区别,它们是同一类型的不同写法。C++ 标准规定 short 等价于 short int,而 short 默认带符号,等价于 signed short。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 写
short就够了,简洁且通用;short int多余,只在强调“整型家族”时偶尔用于教学 - 需要无符号时,必须显式写
unsigned short;unsigned short int合法但啰嗦 - 别用
short unsigned这种顺序——虽然部分编译器接受,但不符合标准词法顺序,GCC/Clang 会警告
什么时候真该用 short 而不是 int?
仅当明确需要节省内存,且值域确定落在 ±32767 内,并经过实测确认收益时才用。现代 x86/x64 上,short 运算通常不比 int 快,甚至可能更慢(因需额外的 zero-extend / sign-extend 指令)。
典型场景:
- 大量小整数数组(如图像灰度值缓存、音频采样缓冲区),且内存敏感(嵌入式、GPU 显存受限)
- 与外部二进制协议或硬件寄存器对齐(例如某传感器文档明确要求“16-bit signed integer field”)
- 结构体打包(
#pragma pack(1)或[[gnu::packed]])中控制布局,避免 padding
反例:循环计数器、容器索引、临时计算变量——一律用 int 或更安全的 std::size_t/std::ptrdiff_t。
隐式转换和 printf/scanf 容易崩在哪?
short 在绝大多数表达式中会自动提升为 int(整型提升规则),所以 sizeof(short + short) 是 sizeof(int)。这导致两个常见陷阱:
-
printf("%d", my_short)没问题(因为已提升为int),但printf("%hd", my_short)才是语义正确的写法;若传unsigned short却用%hd,行为未定义 -
scanf("%hd", &my_short)正确;用%d会导致写入 4 字节,破坏相邻栈变量(UB) - 函数传参时,如果形参是
short,调用方传int会隐式截断——编译器通常只给 warning(如-Wconversion),但数据可能静默丢失
复杂点在于:这些错误往往不报错,只在特定输入下才暴露。别依赖“好像没出事”,加编译选项 -Wconversion -Wsign-conversion 是底线。










