unsigned short 是 C 语言中一种基本的数据类型,它由两个关键字组成:

unsigned:表示“无符号”,意味着这个类型只能表示非负数(0 和正数)。short:表示“短整型”,通常是计算机体系结构中定义的最小的整数类型之一(或与int大小相同)。
结合起来,unsigned short 就是一种“无符号短整型”。
核心概念
a. unsigned vs. signed
在 C 语言中,整数类型默认是 signed(有符号)的,这意味着它既可以表示正数,也可以表示负数,计算机使用最高位(Most Significant Bit, MSB)作为符号位:0 代表正数,1 代表负数。
unsigned 关键字则告诉编译器:“这个变量没有符号位,所有位都用来表示数值”,它只能表示 0 和正数。
一个简单的比喻:

signed short(有符号短整型):就像一个有正负刻度的尺子,范围是-32768到+32767。unsigned short(无符号短整型):像一个从 0 开始的里程表,范围是0到+65535。
b. short vs. int
short 类型的大小不固定,它取决于具体的 C 实现和编译器,根据 C 语言标准,short 的大小必须至少为 16 位(2 字节),并且不能大于 int 的大小。
- 在大多数现代系统(如 Windows、Linux、macOS 的 64/32 位环境)上,
short通常是 16 位,而int是 32 位。 - 在一些非常古老的或特定的嵌入式系统上,
short和int的大小可能相同(都是 16 位)。
当我们说 unsigned short 时,我们通常可以假设它占用 2 个字节(16 位),但这不是绝对的,使用 sizeof 运算符是最好的实践。
关键属性总结
| 属性 | 描述 |
|---|---|
| 类型名称 | unsigned short |
| 含义 | 无符号短整型 |
| 大小 | 至少 16 位,通常是 16 位(2 字节)。 |
| 取值范围 | 如果是 16 位:0 到 65535 (即 0 到 2¹⁶ - 1)。如果是 32 位: 0 到 4294967295 (即 0 到 2³² - 1)。 |
| 内存表示 | 所有位都用于表示数值,没有符号位。 |
| 关键字 | unsigned, short |
示例代码
下面是一个完整的 C 程序,演示了 unsigned short 的使用、取值范围和大小。
#include <stdio.h>
#include <limits.h> // 包含了各种数据类型的限制信息,如 USHRT_MAX
int main() {
// 1. 声明一个 unsigned short 变量
unsigned short number = 500;
printf("变量 number 的值: %u\n", number); // 使用 %u 来打印无符号整数
// 2. 查看该类型在当前系统上占用的字节数
printf("sizeof(unsigned short) = %zu 字节\n", sizeof(unsigned short));
// 3. 查看其最大值和最小值
// 最小值永远是 0
printf("unsigned short 的最小值: %u\n", 0);
// 最大值
// 方法一:使用 limits.h 中定义的宏
printf("unsigned short 的最大值 (USHRT_MAX): %u\n", USHRT_MAX);
// 方法二:手动计算 (假设是16位)
// unsigned short max_val = (unsigned short)(-1); // 一种巧妙的取最大值方法
// printf("unsigned short 的最大值 (手动计算): %u\n", max_val);
// 或者
unsigned short max_val_16bit = 65535;
printf("unsigned short 的最大值 (手动计算, 16位): %u\n", max_val_16bit);
// 4. 演示溢出
printf("\n--- 演示溢出 ---\n");
unsigned short max = USHRT_MAX;
printf("当前最大值: %u\n", max);
// 加 1,会发生算术溢出
max = max + 1;
printf("加 1 后的值: %u\n", max); // 结果会回绕到 0
// 从 0 减 1,也会发生溢出
unsigned short zero = 0;
printf("当前最小值: %u\n", zero);
zero = zero - 1;
printf("减 1 后的值: %u\n", zero); // 结果会回绕到最大值 (USHRT_MAX)
return 0;
}
可能的输出(在 16-bit short 的系统上):

变量 number 的值: 500
sizeof(unsigned short) = 2 字节
unsigned short 的最小值: 0
unsigned short 的最大值 (USHRT_MAX): 65535
unsigned short 的最大值 (手动计算, 16位): 65535
--- 演示溢出 ---
当前最大值: 65535
加 1 后的值: 0
当前最小值: 0
减 1 后的值: 65535
代码解释:
printf使用%u格式说明符来打印unsigned类型。sizeof(unsigned short)返回该类型占用的字节数,这在跨平台编程中非常重要。limits.h是一个标准头文件,它定义了各种整数类型的极限值(如USHRT_MAX),这是获取最大值的可靠方法。- 溢出:
unsigned类型的算术运算是“模运算”(Modular Arithmetic),当结果超出其表示范围时,它会自动“回绕”。65535 + 1会得到0,0 - 1会得到65535,这种行为是定义好的,而不是未定义行为。
使用场景
unsigned short 通常用于以下场景:
-
节省内存:当确定数值不会是负数,并且范围在
0到65535之间时,使用unsigned short比int更节省内存,这在内存资源受限的嵌入式系统或处理大量数据时(如数组、图像像素)非常有用。 -
处理位操作:由于它没有符号位,在进行位操作(如按位与
&、按位或 、移位<<,>>)时,逻辑更清晰、更直接。 -
表示计数器或索引:数组的长度、循环次数、文件大小等,这些值天然就是非负数,使用
unsigned类型可以防止意外出现负数。 -
网络协议和文件格式:许多网络协议和二进制文件格式使用固定大小的无符号整数来表示长度、校验和等字段。
常见错误与注意事项
-
有符号与无符号混合运算:当
signed和unsigned类型混合运算时,signed类型会被提升为unsigned类型,这可能会导致意想不到的结果。signed int a = -10; unsigned short b = 5; int result = a + b; // a 会被临时提升为 unsigned int // -10 + 5 = -5 // 但在计算中,-10 会被转换为一个很大的 unsigned int // 在 32 位系统中,-10 的二进制补码是 0xFFFFFFF6 // 0xFFFFFFF6 + 5 = 0xFFFFFFFB (这是一个非常大的正数) // 当结果被赋给 int 类型的 result 时,它又被解释为负数 -1 // result 的值不是 -5,而是一个负数。 printf("a + b = %d\n", result); // 输出可能不是 -5 -
格式化输出错误:使用错误的
printf格式说明符。- 打印
unsigned short应该用%u。 - 如果错误地使用
%d(用于signed int),编译器可能会发出警告,并且在某些情况下会导致输出错误。
- 打印
-
忽略大小的不确定性:虽然
short通常是 16 位,但不要在代码中硬编码65535作为最大值,应该使用USHRT_MAX来保证代码的可移植性。
unsigned short 是 C 语言中一个基础但重要的数据类型,它通过牺牲负数表示能力,换取了更大的正数范围(相对于 signed short)和内存上的优势,理解其大小、范围、溢出行为以及与 signed 类型混合运算时的规则,是编写健壮、可移植 C 代码的关键。
