当前位置: 首页 > news >正文

C/C++中基本数据类型在32位/64位系统下的大小

一、 引言

在C/C++开发中,尤其是在跨平台(如32位与64位系统)项目中,我们经常会遇到一些‘诡异’的问题:为什么这段代码在32位系统上运行正常,到64位就崩溃了?其中一个最常见的根源就是对数据类型的大小理解不透彻。今天,我们就来彻底弄清楚intlong指针等类型在不同系统架构下究竟占多少字节。

二、 核心原则:数据模型(Data Model)
  • C/C++标准只规定了相对大小(如sizeof(int) <= sizeof(long)),并没有规定绝对大小。

  • 具体的大小由编译器和系统架构共同决定,遵循所谓的数据模型(Data Model)

  • 最常见的两种模型:

    • LP32 / ILP32: 主要用于 32 位系统(如 Windows 32-bit, Linux 32-bit)

    • LP64: 主要用于 64 位系统(如 Unix-like 系统:Linux, macOS)

    • LLP64: 用于 64 位 Windows

三、 核心数据对比表

下表总结了最常见数据类型在不同模型下的大小(单位:字节)。

数据类型32位系统 (ILP32/LP32)64位 Linux/Unix (LP64)64位 Windows (LLP64)说明与注意事项
char111字符类型,大小固定
short (int)222短整型,大小固定
int444整型,在64位系统下通常保持4字节
long (int)484最重要的区别! Unix系64位是8字节,Windows 64位是4字节
long long (int)888长整型,大小固定(C99/C++11标准)
指针 (void, int等)488最关键的区别! 64位系统寻址空间更大,指针变为8字节
size_t488无符号类型,用于表示对象大小(如sizeof的返回值)
float444单精度浮点数,大小固定
double888双精度浮点数,大小固定
long double8/12/16168扩展精度,编译器实现差异很大,不具有跨平台一致性

表注:

  • 指针 和 long 是32位向64位过渡中最容易引发问题的类型。

  • size_t 通常被定义为足以表示系统中最大可能对象的大小,因此在64位系统上变为8字节。

四、 如何编程确定数据类型大小?
#include <iostream>
using namespace std;int main() {cout << "===== 当前系统数据类型大小 =====" << endl;cout << "Size of char: " << sizeof(char) << " byte" << endl;cout << "Size of short: " << sizeof(short) << " bytes" << endl;cout << "Size of int: " << sizeof(int) << " bytes" << endl;cout << "Size of long: " << sizeof(long) << " bytes" << endl;cout << "Size of long long: " << sizeof(long long) << " bytes" << endl;cout << "Size of pointer (void*): " << sizeof(void*) << " bytes" << endl;cout << "Size of size_t: " << sizeof(size_t) << " bytes" << endl;cout << "Size of float: " << sizeof(float) << " bytes" << endl;cout << "Size of double: " << sizeof(double) << " bytes" << endl;cout << "Size of long double: " << sizeof(long double) << " bytes" << endl;// 判断是32位还是64位指针(最可靠的方法)if (sizeof(void*) == 4) {cout << "编译环境:32-bit" << endl;} else if (sizeof(void*) == 8) {cout << "编译环境:64-bit" << endl;} else {cout << "编译环境:未知" << endl;}return 0;
}
五、 常见陷阱与最佳实践

这部分是博客的精华,告诉读者如何避免踩坑。

  1. 陷阱一:将指针强制转换为intlong

    • 错误原因: 在64位系统上,指针是8字节,int是4字节,会发生截断,导致程序崩溃。

    • 解决方案: 使用uintptr_t(定义在<cstdint>中),它是一种足以安全存储指针的无符号整数类型。

    // ❌ 错误做法(64位系统下会截断)
    int my_ptr_value = (int)(ptr);// ✅ 正确做法
    #include <cstdint>
    uintptr_t my_ptr_value = (uintptr_t)(ptr);
  2. 陷阱二:使用int来接收sizeofstrlen的返回值

    • 错误原因: sizeofstrlen返回size_t类型,在64位下是8字节。如果用一个int(4字节)接收,当值很大时可能溢出。

    • 解决方案: 始终使用size_t类型来接收。

    // ❌ 潜在风险
    int size = sizeof(my_array);// ✅ 正确做法
    size_t size = sizeof(my_array);
  3. 陷阱三:假设long总是4字节或8字节

    • 错误原因: 如上表所示,long在Windows和Unix-like的64位系统下大小不同,编写跨平台代码时不能做任何假设。

    • 解决方案: 如果需要固定大小的整数,使用标准整数类型(定义在<cstdint>中)。

    #include <cstdint>
    int8_t  a; // 精确的1字节有符号整数
    uint8_t b; // 精确的1字节无符号整数
    int32_t c; // 精确的4字节有符号整数(在32/64位系统下都是4字节)
    uint64_t d; // 精确的8字节无符号整数(在32/64位系统下都是8字节)
六、 结尾总结

理解数据类型的大小是C/C++程序员的基本功,尤其是在当今64位系统为主流的时代。

  • 核心记住两点: 指针long类型的大小在64位系统下最可能发生变化。

  • 不要做任何假设: 编程时使用sizeof操作符来获取确切大小。

  • 编写可移植代码: 优先使用size_t处理大小和长度,使用<cstdint>中的int32_tuint64_t等类型来声明明确大小的整数。

掌握这些知识,能让你有效避免一堆令人头疼的内存错误和跨平台兼容性问题。


文章转载自:

http://5uB4BvKg.qnpyz.cn
http://V3ZnnuZm.qnpyz.cn
http://ME8L5s1T.qnpyz.cn
http://ZqlvJGjL.qnpyz.cn
http://m0xrgzwn.qnpyz.cn
http://TTIAO16G.qnpyz.cn
http://YqZrLN0j.qnpyz.cn
http://U8cwezvu.qnpyz.cn
http://0HBY8WwG.qnpyz.cn
http://q1Mwmcci.qnpyz.cn
http://GuN5IsA7.qnpyz.cn
http://nzCIDFUY.qnpyz.cn
http://9bJYpHN8.qnpyz.cn
http://Dw1MEbkB.qnpyz.cn
http://S85RWMVg.qnpyz.cn
http://nDQwa1Qh.qnpyz.cn
http://1q8JlhD0.qnpyz.cn
http://hJBLalda.qnpyz.cn
http://UE7yFGfG.qnpyz.cn
http://lnTqhhvP.qnpyz.cn
http://phqGzsQa.qnpyz.cn
http://BWnkK9fw.qnpyz.cn
http://vYatkQO2.qnpyz.cn
http://ZBNuMDxq.qnpyz.cn
http://5DO27Z1u.qnpyz.cn
http://sxHnEO6s.qnpyz.cn
http://GoqRfG19.qnpyz.cn
http://cNZTmJSr.qnpyz.cn
http://7jJSMJCm.qnpyz.cn
http://BhNQrdA7.qnpyz.cn
http://www.dtcms.com/a/375510.html

相关文章:

  • TensorFlow 和 PyTorch两大深度学习框架训练数据,并协作一个电商推荐系统
  • ceph scrub 参数
  • JavaWeb--day1--HTMLCSS
  • 全国连锁贸易公司数字化管理软件-优德普SAP零售行业解决方案
  • C++面向对象之继承
  • AI原生编程:智能系统自动扩展术
  • Wireshark TS | 接收数据超出接收窗口
  • 第一代:嵌入式本地状态(Flink 1.x)
  • 4.1-中间件之Redis
  • Django ModelForm:快速构建数据库表单
  • 【迭代】:本地高性能c++对话系统e2e_voice
  • SSE与Websocket、Http的关系
  • 蓓韵安禧DHA展现温和配方的藻油与鱼油营养特色
  • 基于UNet的视网膜血管分割系统
  • python函数和面向对象
  • 嵌入式 - ARM(3)从基础调用到 C / 汇编互调
  • 07MySQL存储引擎与索引优化
  • 面向OS bug的TypeState分析
  • 【文献笔记】Task allocation for multi-AUV system: A review
  • 小红书批量作图软件推荐运营大管家小红书批量作图工具
  • ArrayList详解与实际应用
  • 德意志飞机公司与DLR合作完成D328 UpLift演示机地面振动测试
  • MongoDB 备份与恢复终极指南:mongodump 和 mongorestore 深度实战
  • ctfshow - web - 命令执行漏洞总结(二)
  • 基于STM32的GPS北斗定位系统
  • 2025年大陆12寸晶圆厂一览
  • VMware Workstation Pro 安装教程
  • Java Spring @Retention三种保留策略
  • 低代码平台的核心组件与功能解析:红迅低代码平台实战探秘
  • linux sudo权限