sizeof(long)在不同平台结果不同,因为C++标准仅规定long至少4字节,实际大小由数据模型决定:Windows采用LLP64(long为4字节),Linux/macOS采用LP64(long为8字节)。

不一样。 long 在 Windows x64(MSVC/MinGW)上是 4 字节,在 Linux/Unix x64(GCC/Clang)上是 8 字节——同一份代码,编译后行为可能完全不同。
为什么 sizeof(long) 在不同平台结果不同?
因为 C++ 标准只要求 long 至少 4 字节(32 位),没规定上限。实际大小由“数据模型”决定:
- Windows 用 LLP64 模型:
long= 4 字节,long long= 8 字节,指针 = 8 字节 - Linux/macOS 用 LP64 模型:
long= 8 字节,指针 = 8 字节,int仍为 4 字节
这意味着你写 long x = 0x100000000LL;,在 Linux 上能存下,在 Windows 上会截断成 0。
哪些场景下 long 的差异会直接导致崩溃?
最典型的是二进制序列化、FFI 调用、内存布局强依赖的代码:
立即学习“C++免费学习笔记(深入)”;
- 用
struct { long id; char name[32]; }存到文件,再在另一平台读——id字段错位,name解析全乱 - 调用 C 动态库时,头文件里声明
void process(long value);,但 Windows DLL 期望 4 字节参数,Linux SO 传了 8 字节——栈被踩坏 -
std::vector<long></long>和std::vector<int64_t></int64_t>占用内存不同,用memcpy批量拷贝时越界
怎么安全地替代 long?
别猜,用标准固定宽度类型:
- 需要 32 位整数 → 用
int32_t/uint32_t(来自<cstdint>) - 需要 64 位整数 → 优先选
int64_t,不是long或long long(后者虽通常 64 位,但 C++11 只保证 ≥64 位) - 要存指针值 → 用
intptr_t或uintptr_t,它们长度始终匹配指针 - 表示对象大小或数组索引 → 用
size_t,它在 64 位系统上就是 8 字节,且语义明确
顺便提醒:long long 虽在主流平台都是 8 字节,但它的字面量必须带 LL 后缀,否则 123456789012345 可能被当 int 或 long 处理而溢出。
最容易被忽略的一点
printf 和 scanf 的格式符必须和实际类型严格匹配:用 %ld 打印 long 在 Windows 没问题,在 Linux 会因参数截断导致后续输出错乱;跨平台时应统一用 PRId32、PRId64 等宏(来自 <inttypes.h>),它们会自动展开成对应平台正确的格式符。


















