C++ 常用整型数据类型概览
C++ 提供了多种整型,用于存储整数值。它们的主要区别在于:
- 所占字节数(决定了能表示的数值范围)
- 是否带符号(能否表示负数)
1. 基本整型 (Native Types)
这些类型的大小可能因编译器和平台而异,但遵循一定的保证: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
类型 | 常见大小 (字节) | 范围 (示例, 32位系统) | 是否带符号 | 用途 |
---|---|---|---|---|
char | 1 | [-128, 127] 或 [0, 255] | 依赖实现 | 字符存储,最小整数 |
signed char | 1 | [-128, 127] | 带符号 | 同上,明确带符号 |
unsigned char | 1 | [0, 255] | 无符号 | 同上,明确无符号 |
short | 2 | [-32,768, 32,767] | 带符号 | 小范围整数 |
unsigned short | 2 | [0, 65,535] | 无符号 | 小范围非负整数 |
int | 4 | [-2*10^9, 2*10^9] (约) | 带符号 | 最常用,通用整数 |
unsigned int | 4 | [0, 4*10^9] (约) | 无符号 | 通用非负整数 |
long | 4 或 8 | [-2*10^9, 2*10^9] (32位) 或 [-9*10^18, 9*10^18] (64位) | 带符号 | 比 int 可能更大范围的整数 |
unsigned long | 4 或 8 | 对应 long 的无符号范围 | 无符号 | 对应 long 的非负整数 |
long long | 8 | [-9*10^18, 9*10^18] (约) | 带符号 | 最大范围,C++11引入 |
unsigned long long | 8 | [0, 1.8*10^19] (约) | 无符号 | 最大范围非负整数,C++11引入 |
注:
- 默认带符号: 除
char
外,不加signed
关键字的整型(如int
)默认是带符号的。 - 无符号: 在类型前加
unsigned
关键字(如unsigned int
)。
2. 固定宽度整型 (C++11 <cstdint>
)
为确保跨平台的一致性,C++11 引入了固定位宽的整型。推荐用于需要精确控制数据大小的场景(如文件格式、网络协议)。
类型 | 宽度 (位) | 是否带符号 | 典型用途 |
---|---|---|---|
int8_t | 8 | 带符号 | 小整数,字节数据 |
int16_t | 16 | 带符号 | 短整数 |
int32_t | 32 | 带符号 | 常用整数,替代 int 以确保位宽 |
int64_t | 64 | 带符号 | 大整数,替代 long long 以确保位宽 |
uint8_t | 8 | 无符号 | 字节数据,颜色分量(0-255) |
uint16_t | 16 | 无符号 | 端口号,图像像素值 |
uint32_t | 32 | 无符号 | 哈希值,计数器,替代 unsigned int 以确保位宽 |
uint64_t | 64 | 无符号 | 大哈希值,时间戳,替代 unsigned long long 以确保位宽 |
3. 最佳实践
- 默认使用
int
: 除非有特定需求,int
是最常见的选择。 - 需要大范围时: 优先考虑
long long
。 - 需要明确位宽时: 使用
<cstdint>
中的固定宽度类型(如int32_t
,uint64_t
),这能大大提高代码的可移植性和健壮性。 - 非负数且范围要求: 使用
unsigned
版本或对应的uintN_t
。 - 内存优化(不常见): 仅在内存极其受限的嵌入式系统等场景下,才考虑使用
short
或char
作为数值类型。