1、标准规定的基本要求
C 和 C++ 标准没有明确规定 int
、long
、short
等整数类型在字节(byte
)或位(bit
)上的具体大小,而是定义了它们之间的相对大小关系和最小宽度。
1)整型大小的关系
#include <iostream> int main() { std::cout << "sizeof(char) = " << sizeof(char) << " byte(s)" << std::endl; std::cout << "sizeof(short) = " << sizeof(short) << " byte(s)" << std::endl; std::cout << "sizeof(int) = " << sizeof(int) << " byte(s)" << std::endl; std::cout << "sizeof(long) = " << sizeof(long) << " byte(s)" << std::endl; std::cout << "sizeof(long long) = " << sizeof(long long) << " byte(s)" << std::endl; bool cond1 = sizeof(char) <= sizeof(short); bool cond2 = sizeof(short) <= sizeof(int); bool cond3 = sizeof(int) <= sizeof(long); bool cond4 = sizeof(long) <= sizeof(long long); if (cond1 && cond2 && cond3 && cond4) { std::cout << "The condition sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) holds true." << std::endl; } else { std::cout << "The condition does NOT hold true on this system." << std::endl; } return 0; }
注意:输出可能因平台和编译器不同而略有差异,但 C++ 标准只要求这些类型的大小顺序是递增的。
2)最小位宽(最低要求)
类型 | 最小位数(有效位数) | 含义说明 |
char | 8 位(1 字节) | 标准保证至少有 8 位 |
short | ≥ 16 位 | 至少能表示 -32,767 到 32,767 |
int | ≥ 16 位 | 实际上大多数平台是 32 位 |
long | ≥ 32 位 | 例如在 Windows 是 32 位,Linux 是 64 位 |
long long | ≥ 64 位 | 标准要求至少为 64 位 |
2、实际应用
跨平台时不要假设大小一致,不同平台下 long
可能是 32
位或 64
位。推荐使用 提供的固定宽度类型(如 int32_t
, int64_t
)来保证一致性。使用 sizeof
运算符查看类型在当前编译器下的实际字节数。
#include <iostream> #include <cstdint> int main() { std::cout << "sizeof(int): " << sizeof(int) << " bytes\n"; std::cout << "sizeof(long): " << sizeof(long) << " bytes\n"; std::cout << "sizeof(long long): " << sizeof(long long) << " bytes\n"; // 使用固定宽度类型 int32_t a = 123; int64_t b = 4567890123; std::cout << "int32_t: " << a << "\n"; std::cout << "int64_t: " << b << "\n"; return 0; }