C++11 超长整型 long long 详解与跨平台特性分析
C++11 中的 long long 基础规范
C++11 标准正式引入 long long 整型,旨在为开发者提供明确的大范围数值支持。根据标准规定,该类型在不同编译环境下的位宽可以存在差异,但绝对下限必须达到 8 字节(即 64 位)。该类型主要分为有符号的 long long 与无符号的 unsigned long long 两种形式。
字面量后缀与类型别名
为精确控制常量类型,C++ 提供了严格的后缀规则。使用大写的 LL 比小写 ll 更具可读性,可有效避免视觉上的字符混淆。无符号版本则允许使用 ULL 及其大小写混合形式。
// 定义有符号长整型常量
long long val_sign_a = 987654LL;
long long val_sign_b = 987654ll;
// 定义无符号长整型常量
unsigned long long val_unsign_a = 1000000ULL;
unsigned long long val_unsign_b = 1000000ull;
unsigned long long val_unsign_c = 1000000uLL;
在声明时,以下写法均与上述基础类型完全等价:
- 有符号变体:
long long int、signed long long、signed long long int - 无符号变体:
unsigned long long int
边界常量与宏定义提取
与基础整型类似,标准库通过预定义宏提供了极值查询接口。实际开发中,常将其封装于独立函数内进行提取与校验:
#include <iostream>
#include <climits>
void extract_range_constants() {
long long floor_val = LLONG_MIN;
long long peak_val = LLONG_MAX;
unsigned long long max_unsign = ULLONG_MAX;
std::cout << "Lower Limit: " << floor_val << '\n';
std::cout << "Upper Limit: " << peak_val << '\n';
std::cout << "Max Unsigned: " << max_unsign << '\n';
}
执行上述逻辑的标准输出通常如下所示:
Lower Limit: -9223372036854775808
Upper Limit: 9223372036854775807
Max Unsigned: 18446744073709551615
跨平台尺寸模型与整型族谱总结
C++ 标准仅保证各类整型的最小占用空间,并不强制规定其具体长度。这一设计直接导致了不同操作系统与编译器 ABI 下的内存布局差异:
short:至少 16 位int:长度不小于shortlong:至少 32 位,且长度不小于intlong long:至少 64 位,且长度不小于long
在实际工程部署中,常见的 ABI 模型分为 LLP64(Microsoft Visual C++)与 LP64(绝大多数 UNIX/Linux 发行版)。下表汇总了各主流环境下的具体占用字节数及数值映射范围:
| 类型标识 | Windows (LLP64) | Linux 32位 (ILP32) | Linux 64位 (LP64) |
|---|---|---|---|
int |
4 字节 [−231, 231−1] INT_MIN=−2147483648 INT_MAX=2147483647 |
4 字节 [−231, 231−1] |
4 字节 [−231, 231−1] |
unsigned int |
4 字节 [0, 232−1] UINT_MAX=4294967295 |
4 字节 [0, 232−1] |
4 字节 [0, 232−1] |
short |
2 字节 [−215, 215−1] |
2 字节 [−215, 215−1] |
2 字节 [−215, 215−1] |
unsigned short |
2 字节 [0, 216−1] |
2 字节 [0, 216−1] |
2 字节 [0, 216−1] |
long |
4 字节 [−231, 231−1] |
4 字节 [−231, 231−1] |
8 字节 [−263, 263−1] |
unsigned long |
4 字节 [0, 232−1] |
4 字节 [0, 232−1] |
8 字节 [0, 264−1] |
long long |
8 字节 [−263, 263−1] |
8 字节 [−263, 263−1] |
8 字节 [−263, 263−1] |
unsigned long long |
8 字节 [0, 264−1] |
8 字节 [0, 264−1] |
8 字节 [0, 264−1] |
