short类型取值范围为-32768到32767,因其采用16位二进制补码表示:符号位占1位,剩余15位表数值,最大正数为2¹⁵−1=32767,最小负数由补码约定定为-32768,共覆盖2¹⁶=65536个整数。

short 类型取值范围是 -32768 到 32767,根本原因在于它用 16 位二进制、以补码形式表示有符号整数。
short 占 16 位,符号位占 1 位
short 在绝大多数平台(C/C++、Java 等)中固定占 2 字节,即 16 个二进制位。其中最高位(第 15 位,从 0 开始计)作为符号位:0 表示正数或零,1 表示负数。剩下 15 位用于表示数值大小。
- 最大正数:符号位为 0,其余 15 位全为 1 →
0111 1111 1111 1111,等于 $2^{15} - 1 = 32767$ - 最小负数不是 -32767,而是 -32768,这由补码规则决定
补码系统让 -32768 成为可能
计算机不直接存负数的“原码”,而是用补码。对一个负数,补码 = 原码符号位不变、其余位取反再加 1。而补码设计有个关键约定:1000 0000 0000 0000 这个模式被专门定义为 -32768,而不是 -0 或其他值。
- 这个值无法用“先写原码再取补”常规方式得到(因为 -0 不存在),它是补码体系人为分配的特殊值
- 这样分配后,16 位能表示恰好 $2^{16} = 65536$ 个不同整数:-32768 ~ -1(32768 个负数)、0(1 个)、+1 ~ +32767(32767 个正数)
- 总数 32768 + 1 + 32767 = 65536,完全利用了全部 16 位组合
溢出行为印证这个范围
当你给 short 变量赋值 32767 后再加 1,结果不是报错,而是变成 -32768 —— 这正是二进制 0111111111111111 加 1 溢出成 1000000000000000 的自然结果。
- 这种“绕回”行为说明硬件层面严格按补码规则运算
- 编译器不检查运行时数值是否越界,只做截断:33000 赋给 short,实际存入的是它的低 16 位,结果等价于 33000 % 65536 再按补码解释
无符号 short 是另一回事
如果你声明的是 unsigned short,那就没有符号位,全部 16 位都参与数值表达,范围就是 0 到 $2^{16} - 1 = 65535$。这说明 -32768 ~ 32767 这个范围只适用于默认的 signed short。
- signed short 和 unsigned short 底层都是 16 位,只是解释方式不同
- C 标准只要求 short 至少 16 位,但实践中几乎总是正好 16 位;int 可能是 16 或 32 位,所以 short 的范围反而更确定

















