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;
}