short 是 C 语言中的一个基本数据类型,它的全称是“短整型”,它的主要目的是为了节省内存,当你确定一个变量的值不会很大,不需要使用标准的 int 类型那么大的范围时,就可以使用 short。

short 是什么?
short 是一种整数类型,用于存储整数值,它与 int、long、long long 等同属整型家族。
核心特点:内存占用小
short 的核心优势在于它占用的内存空间通常比 int 小。
- 在大多数现代系统(如 64 位 Windows、Linux、macOS)上:
int占用 4 字节 (32 位)。short占用 2 字节 (16 位)。
这意味着,当你有大量需要存储的小整数时(一个游戏中的坐标、一个数组索引),使用 short 可以显著减少内存占用。
取值范围受限
因为占用的位数少,short 能表示的整数范围也小得多。

对于一个有符号的 short(可以存储正数和负数):
- 位数:16 位
- 范围:-32,768 到 32,767 (即 -2¹⁵ 到 2¹⁵ - 1)
对于一个无符号的 short(只能存储非负数):
- 位数:16 位
- 范围:0 到 65,535 (即 0 到 2¹⁶ - 1)
注意:
short的确切大小和范围是由 C 标准规定的,但具体实现(编译器和目标平台)可能有所不同,标准只保证short的长度不超过int的长度,在几乎所有的现代平台上,short都是 16 位。
如何声明和使用 short
声明 short 变量非常简单,直接使用 short 关键字。

基本声明和赋值
#include <stdio.h>
int main() {
// 声明一个有符号的 short 变量
short s_num = 100;
printf("有符号 short s_num = %d\n", s_num); // %d 是打印有符号整数的格式
// 声明一个无符号的 short 变量
unsigned short us_num = 50000;
printf("无符号 short us_num = %u\n", us_num); // %u 是打印无符号整数的格式
return 0;
}
超出范围的后果(非常重要!)
如果你给 short 变量赋一个超出其范围的值,会发生“整数溢出” (Integer Overflow),程序不会报错,但数值会“回绕”,得到一个意想不到的结果。
#include <stdio.h>
int main() {
short max_short = 32767; // short 的最大正值
printf("最大值: %d\n", max_short);
// 加 1,会溢出
max_short = max_short + 1;
printf("加 1 后: %d\n", max_short); // 输出会是 -32768
// 继续加
max_short = max_short + 1;
printf("再加 1 后: %d\n", max_short); // 输出会是 -32767
// 无符号的例子
unsigned short max_ushort = 65535; // unsigned short 的最大值
printf("无符号最大值: %u\n", max_ushort);
// 加 1,会溢出
max_ushort = max_ushort + 1;
printf("无符号加 1 后: %u\n", max_ushort); // 输出会是 0
return 0;
}
运行结果:
最大值: 32767
加 1 后: -32768
再加 1 后: -32767
无符号最大值: 65535
无符号加 1 后: 0
这个特性是 C 语言中一个常见的陷阱,需要特别注意。
short、int 和 long 的关系
理解它们之间的关系很重要。
| 类型 | 典型大小 (字节) | 典型范围 (有符号) | 特点 |
|---|---|---|---|
short |
2 | -32,768 到 32,767 | 内存占用小,范围小 |
int |
4 | -2,147,483,648 到 2,147,483,647 | 最常用的整数类型,性能通常最优 |
long |
4 或 8 | 4字节时同 int,8字节时范围更大 | 在 64 位系统上通常是 8 字节 |
long long |
8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 范围最大的标准整数类型 |
核心规则:
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)int是系统“最自然”的整数大小,通常运算速度最快。- 除非有特殊需求(如节省内存或处理特定硬件接口),否则优先使用
int。
什么时候应该使用 short?
short 并不常用,但在以下场景下非常有用:
-
内存敏感的应用:
-
当你需要存储数百万个整数时,例如在图像处理(每个像素的坐标)、大型数组或数据结构中,使用
short可以将内存占用减少一半。 -
示例:存储一个 1024x1024 的二维坐标数组。
// 使用 int: 1024 * 1024 * 4 bytes = 4 MB int coordinates_int[1024][1024]; // 使用 short: 1024 * 1024 * 2 bytes = 2 MB (节省了一半内存) short coordinates_short[1024][1024];
-
-
与硬件或文件格式交互:
- 某些硬件寄存器、网络协议头或文件格式(如旧的 BMP 图像文件)可能明确要求使用 16 位整数,在这种情况下,必须使用
short或uint16_t来保证数据格式正确。
- 某些硬件寄存器、网络协议头或文件格式(如旧的 BMP 图像文件)可能明确要求使用 16 位整数,在这种情况下,必须使用
-
嵌入式系统开发:
- 在资源极其受限的微控制器上,内存非常宝贵,每一字节都至关重要,使用
short是常态。
- 在资源极其受限的微控制器上,内存非常宝贵,每一字节都至关重要,使用
short 与 int 的转换
当 short 和 int 混合运算时,C 语言会进行“整数提升” (Integer Promotion)。
规则是:short 会被自动转换为 int(前提是 int 能容纳 short 的所有值,这在现代系统中总是成立)。
#include <stdio.h>
int main() {
short s = 100;
int i = 20000;
long result;
// s 会被自动提升为 int,然后与 i 相加
// 最终结果 (int) 会被赋值给 result (long)
result = s + i;
printf("s = %hd, i = %d\n", s, i); // %hd 用于打印 short
printf("result = %ld\n", result); // %ld 用于打印 long
return 0;
}
在这个例子中,你不需要手动进行类型转换,编译器会自动处理,这保证了运算的精度,但也意味着 short 的“节省内存”优势在参与运算时会暂时消失。
更好的选择:<stdint.h> 中的固定宽度整数类型
现代 C 编程(特别是 C99 标准之后)更推荐使用 <stdint.h> 头文件中定义的类型,而不是 short、long 这些依赖于平台的大小不定的类型。
int16_t: 一个正好 16 位的 signed 整型。uint16_t: 一个正好 16 位的 unsigned 整型。int32_t: 一个正好 32 位的 signed 整型。uint32_t: 一个正好 32 位的 unsigned 整型。
为什么更好? 因为它们的大小是明确且固定的,不依赖于你使用的编译器或操作系统,这让你的代码更具可移植性。
#include <stdio.h>
#include <stdint.h> // 必须包含这个头文件
int main() {
// 使用固定宽度类型,代码意图更清晰,可移植性更好
int16_t my_small_num = 30000;
uint16_t my_unsigned_small_num = 40000;
printf("int16_t: %d\n", my_small_num);
printf("uint16_t: %u\n", my_unsigned_small_num);
return 0;
}
short:一个传统的、大小可能不固定的 16 位左右整数类型。- 何时用:当你明确需要节省内存,并且目标平台上的
short大小符合预期时。 - 何时不用:在绝大多数通用应用程序中,优先使用
int。 - 最佳实践:当需要特定大小的整数(如 16 位)时,优先使用
<stdint.h>中的int16_t或uint16_t,它们更清晰、更安全、更具可移植性。
