C++ 标准中 int 和 long 类型大小

C++ 标准中,int 和 long 的大小并不是固定的字节数,但标准对它们的相对大小关系作出了规定。int 通常是 32 位(4 字节),但标准仅保证至少为 16 位。long 在 Linux/macOS 64 位环境下通常是 64 位,而在 Windows 上仍是 32 位。使用 sizeof(type) 可在代码中查看当前编译平台下的具体字节数。

1、标准规定的基本要求

C 和 C++ 标准没有明确规定 intlongshort 等整数类型在字节(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;
}

推荐阅读
cjavapy编程之路首页