C++ 中 int 和 long 有多少字节?标准给出了意想不到的答案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

大小的谜题:为什么 int 和 long 在不同编译器上表现不同?



每个认真学过 C++ 的人,迟早都会遇到这个难题。你编写简单的代码:



#include <iostream>

int main() { std::cout << "int 的大小: " << sizeof(int) << " 字节"; std::cout << "long 的大小: " << sizeof(long) << " 字节"; std::cout << "long long 的大小: " << sizeof(long long) << " 字节"; return 0;}


在你的笔记本电脑上运行——得到 4, 4, 8。在 Linux 服务器上运行——得到 4, 8, 8。而在旧的 16 位系统上(是的,它们还存在!)——得到 2, 4, 8。问题出在哪里?为什么以强大和控制力著称的 C++ 语言会允许这种不确定性?



答案既简单又复杂:C++ 标准有意将整数类型的大小留给实现自行决定。这不是一个缺陷,而是一个特性,它使得该语言能够在从微控制器到超级计算机的任何硬件上运行。但对开发者来说,这意味着:如果你编写可移植的代码,就不能依赖特定的大小。



让我们来弄清楚 C++ 标准(从 C++98 到 C++23)实际保证了什么,以及如何避免陷入平台依赖的陷阱。



C++ 标准保证了什么?最小大小和层级关系



标准并没有说“int 是 4 字节”,而是规定了最小取值范围和严格的大小层级关系。以下是标准草案([basic.fundamental] 章节)中的关键规则:



  • char 的最小大小:1 字节(8 位,尽管在 C++ 中字节形式上可能更大)。
  • 大小层级关系:sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)。
  • 最小位数:
    • short:至少 16 位。
    • int:至少 16 位。
    • long:至少 32 位。
    • long long:至少 64 位(C++11 中引入)。
  • int 的大小:标准建议 int 具有目标架构的“自然大小”(通常在 32/64 位系统上为 4 字节)。


请注意:long 可以等于 int(在 32 位 Windows 上)或 long long(在 64 位 Linux 上)。这完全合法!



实际示例:在你的系统上检查



运行这段代码,并与来自不同操作系统的同事比较结果:



#include <iostream>#include <climits> // 用于 INT_MAX, LONG_MAX 等

int main() { std::cout << "以字节为单位的大小:"; std::cout << "short: " << sizeof(short) << ""; std::cout << "int: " << sizeof(int) << ""; std::cout << "long: " << sizeof(long) << ""; std::cout << "long long: " << sizeof(long long) << "

";

std::cout << "最大值:"; std::cout << "INT_MAX: " << INT_MAX << ""; std::cout << "LONG_MAX: " << LONG_MAX << ""; std::cout << "LLONG_MAX: " << LLONG_MAX << ""; return 0;}


你会看到,在 Windows (MSVC) 上,long 通常为 4 字节,而在 Linux (GCC/Clang) 上则为 8 字节。这是在平台间移植代码时经典的错误来源。



为什么标准不固定大小?历史背景



想象一下 1970 年代。处理器有 8 位、16 位,而 32 位才刚刚出现。C 语言的创造者(而

博客

书籍推荐