C++标准库头文件 cstdint 举例说明
C++标准库头文件 cstdint 举例说明
1. <cstdint>
<cstdint> 是 C++11 引入的标准库头文件,定义了 固定宽度的整数类型,用于明确指定变量的位数(如 8 位、16 位、32 位、64 位),确保跨平台的一致性。以下是其核心内容和代码示例:
1. 核心类型
| 类型 | 位数 | 符号 | 范围(含) | 典型用途 |
|---|---|---|---|---|
| int8_t / uint8_t | 8 | 有/无符号 | -128~127 / 0~255 | 字节操作、图像像素 |
| int16_t / uint16_t | 16 | 有/无符号 | -32768~32767 / 0~65535 | 短整数、音频采样 |
| int32_t / uint32_t | 32 | 有/无符号 | -231~231-1 / 0~2^32-1 | 通用整数、时间戳 |
| int64_t / uint64_t | 64 | 有/无符号 | -263~263-1 / 0~2^64-1 | 大整数、文件大小 |
| int_leastN_t | ≥N | 有符号 | 平台满足至少 N 位的最小类型 | 节省内存时使用 |
| int_fastN_t | ≥N | 有符号 | 平台处理最快的至少 N 位类型 | 性能优先场景 |
2. 代码示例
(1)精确控制整数位数
#include <cstdint>
#include <iostream>
int main() {
int32_t num32 = 2147483647; // 32位有符号整数(最大值)
uint16_t num16 = 65535; // 16位无符号整数(最大值)
int8_t byte = -128; // 8位有符号整数(最小值)
std::cout << "int32_t: " << num32 << "\n";
std::cout << "uint16_t: " << num16 << "\n";
std::cout << "int8_t: " << static_cast<int>(byte) << "\n";
// 注意:直接输出char类型会显示ASCII字符,需强制转换
return 0;
}
=================================================
输出:
int32_t: 2147483647
uint16_t: 65535
int8_t: -128
=================================================
(2)处理二进制数据(如网络协议)
#include <cstdint>
#include <cstring>
#pragma pack(1) // 禁止内存对齐
struct NetworkPacket {
uint16_t header; // 2字节
uint32_t data; // 4字节
uint8_t checksum; // 1字节
};
#pragma pack()
int main() {
NetworkPacket packet{0xAA55, 0x12345678, 0xEF};
uint8_t raw[sizeof(NetworkPacket)];
memcpy(raw, &packet, sizeof(packet));
// 模拟网络传输(按字节处理)
for (size_t i = 0; i < sizeof(raw); ++i) {
printf("%02X ", raw[i]); // 输出:55 AA 78 56 34 12 EF
}
return 0;
}
用途:确保结构体字段的宽度与协议严格匹配。
(3)跨平台兼容性(避免 int 歧义)
#include <cstdint>
void process(uint32_t userId) { // 明确要求32位无符号
// 确保所有平台处理相同的整数范围
}
int main() {
process(1000000); // 安全:不受int位数影响(如16位系统)
return 0;
}
(4)快速类型(int_fastN_t)与最小类型(int_leastN_t)
#include <cstdint>
#include <iostream>
int main() {
int_fast16_t fastVar = 100; // 平台处理最快的至少16位类型
int_least8_t leastVar = 255; // 至少8位的最小类型(可能是16位)
std::cout << "Size of fast16_t: " << sizeof(fastVar) << " bytes\n";
std::cout << "Size of least8_t: " << sizeof(leastVar) << " bytes\n";
return 0;
}
输出(64位Linux示例):
Size of fast16_t: 8 bytes // 可能用64位寄存器更快
Size of least8_t: 1 byte // 满足至少8位
3. 关键点总结
-
何时使用:
需要精确控制位数时(如协议、硬件交互)。
避免 int/long 的跨平台歧义。 -
性能权衡:
intN_t:精确位数,但某些平台可能较慢。
int_fastN_t:性能优先,位数可能更大。
int_leastN_t:内存节省优先,位数可能更大。 -
与C兼容:
C++ 的对应 C 的 <stdint.h>,但推荐使用 C++ 版本。
4. 注意事项
- 溢出风险:固定宽度类型仍需手动检查范围(如 uint8_t 赋值 256 会截断)。
- 平台支持:极少数嵌入式平台可能不支持某些类型(如 int64_t)。
- 打印技巧:int8_t/uint8_t 实际是 char 的别名,直接打印需强制转换。

浙公网安备 33010602011771号