unsigned short 是 C 语言中一种基本的数据类型,它结合了三个关键修饰符:unsigned、short 和 int(int 是隐含的)。

核心定义
unsigned short 是一种无符号的短整型。
short(短整型): 用来表示一个相对较小的整数,它的主要目的是节省内存空间,因为相比于标准的int类型,short通常占用更少的字节。unsigned(无符号): 这意味着这个数据类型不能存储负数,它的所有位都用来表示数值,因此它能表示的正数范围是标准short的两倍。
内存大小和取值范围
unsigned short 的具体大小和取值范围是由 C 标准规定的,但它的字节数可能因编译器和操作系统的不同而有所差异。
C 标准规定
-
大小:
sizeof(short)必须小于或等于sizeof(int)。sizeof(unsigned short)必须等于sizeof(short)。- 它的大小至少为 2 个字节 (16 位)。
-
取值范围:
(图片来源网络,侵删)- 对于一个
N位的无符号整数,它可以表示的值范围是0到2^N - 1。
- 对于一个
实际应用中的常见情况
在现代的 32 位和 64 位系统上,unsigned short 通常被实现为 16 位 (2 个字节)。
-
大小:
sizeof(unsigned short)的值通常是 2。 -
取值范围:
- 总位数 N = 16
- 最小值 =
0 - 最大值 =
2^16 - 1=65535 - 范围是
0到65535。
注意: 虽然这是最常见的情况,但在某些嵌入式系统或老旧的编译器上,
short可能只有 8 位(1字节),unsigned short的范围就是0到255。永远不要假设unsigned short的大小,如果需要精确的大小,请使用stdint.h头文件中定义的类型。(图片来源网络,侵删)
如何正确使用(可移植性最佳实践)
为了编写可移植、跨平台的代码,你不应该直接使用 unsigned short,而是应该使用 <stdint.h> (或 <cstdint> 在 C++ 中) 头文件中定义的精确宽度类型。
uint16_t: 一个正好 16 位的无符号整数。uint_least16_t: 一个至少 16 位的无符号整数,是平台实现时能找到的最小的满足条件的类型。uint_fast16_t: 一个至少 16 位的无符号整数,在该平台上算术运算最快的类型。
示例:
#include <stdio.h>
#include <stdint.h> // 包含精确宽度整数类型的头文件
int main() {
// 不推荐:可能在不同平台上有不同的大小
unsigned short my_var = 50000;
// 推荐:明确表示需要一个 16 位无符号整数
uint16_t my_portable_var = 50000;
printf("Value of my_var: %u\n", my_var);
printf("Size of my_var: %zu bytes\n", sizeof(my_var));
printf("Value of my_portable_var: %u\n", my_portable_var);
printf("Size of my_portable_var: %zu bytes\n", sizeof(my_portable_var));
return 0;
}
声明和初始化
声明和初始化 unsigned short 变量非常简单。
#include <stdio.h>
int main() {
// 声明一个 unsigned short 变量
unsigned short age;
// 初始化
age = 25;
// 声明并初始化
unsigned short max_score = 100;
// 可以使用十六进制或八进制字面量
unsigned short flags = 0xFFFF; // 十六进制,等于 65535
printf("Age: %u\n", age); // %u 是打印 unsigned int 的格式符,对 unsigned short 也适用
printf("Max Score: %u\n", max_score);
printf("Flags: %u\n", flags);
return 0;
}
运算符
unsigned short 变量支持所有标准的算术和位运算符。
- 算术运算: , , , , (取模)
- 赋值运算: , , , , ,
- 递增/递减: ,
- 位运算:
&(按位与), (按位或),^(按位异或), (按位取反),<<(左移),>>(右移)
重要特性:溢出
unsigned short 的一个关键特性是算术溢出是定义良好的行为,当计算结果超出其最大值(65535)时,它会“环绕”(wrap around),从最小值(0)继续计算。
#include <stdio.h>
#include <limits.h> // 包含各种类型的限制值,如 USHRT_MAX
int main() {
unsigned short a = USHRT_MAX; // USHRT_MAX 通常是 65535
printf("Before increment: %u\n", a);
a++; // a + 1 = 65536
// 65536 超出了 16 位无符号整数的范围 (0-65535)
// 它会环绕,65536 % 65536 = 0
printf("After increment: %u\n", a); // 输出将是 0
unsigned short b = 0;
printf("Before decrement: %u\n", b);
b--; // 0 - 1 = -1
// 对于无符号数,负数会环绕。-1 在 16 位中表示为 65535
printf("After decrement: %u\n", b); // 输出将是 65535
return 0;
}
这种“环绕”行为是 C 标准明确定义的,而不是未定义行为,这在底层编程(如网络协议、嵌入式系统)中非常有用,但在常规应用中需要小心,因为它不会像有符号整数那样抛出溢出错误。
使用场景
unsigned short 主要用于以下场景:
- 节省内存: 当你确定数值不会超过 65535,并且需要大量存储这些数值时(在大型数组或结构体中),使用
unsigned short可以比int节省一半的内存。 - 网络编程: 许多网络协议头(如 IP、TCP、UDP)中的字段长度被定义为 16 位无符号整数,非常适合用
uint16_t或unsigned short来处理。 - 嵌入式系统和硬件接口: 直接与硬件寄存器交互时,寄存器的大小通常是固定的(如 16 位),
unsigned short或其精确宽度类型是理想选择。 - 表示计数器或ID: 当你需要一个永远不会为负数的计数器、索引或 ID,并且其上限已知时(屏幕坐标、游戏中的实体数量),
unsigned short是一个很好的选择。
| 特性 | 描述 |
|---|---|
| 类型名称 | unsigned short |
| 含义 | 无符号短整型 |
| 符号 | 不能表示负数 |
| 典型大小 | 2 字节 (16 位) |
| 标准范围 | 0 到 65535 |
| C 标准头 | <limits.h> (USHRT_MAX) |
| 可移植头 | <stdint.h> (uint16_t) |
| 溢出行为 | 定义良好:数值会从最大值环绕到最小值。 |
| 主要用途 | 节省内存、网络协议、硬件接口、非负计数器。 |
核心建议:在现代 C 编程中,除非有特殊的历史原因或极小的内存限制,否则优先使用 <stdint.h> 中的 uint16_t,因为它能让你的代码意图更清晰,并且保证了跨平台的一致性。

