int 类型所占的字节数,不是 C 语言标准写死固定值,它是由编译器,CPU 架构,操作系统,编译标准共同决定的,判断核心就是查看编译器内置头文件 limits.h 或者 stdint.h 里面的宏定义,也可以直接使用 sizeof 运算符在当前编译环境运行程序输出结果。很多初学者会直接记住 int 永远是 4 字节,这个结论只在主流 32 位和 64 位平台成立,在老式 16 位平台,单片机,特殊嵌入式环境里面 int 可能是 2 字节,甚至部分特殊定制编译环境会调整 int 宽度。C 语言标准只规定 int 必须至少 16 位,也就是最小 2 字节,没有强制规定必须等于 4 字节,int 属于目标平台相关类型,这就是为什么跨平台移植代码的时候,不能硬编码假设 int 的字节长度。
底层原因
C 语言设计 int 这个类型的初衷,是匹配 CPU 原生字长,也就是处理器一次能处理的整数宽度,让 CPU 运算效率最高。早期 16 位 CPU 时代,原生字长 16 位,int 就是 2 字节。后来 32 位 CPU 普及,原生字长 32 位,int 变成 4 字节。到 64 位 CPU 的时候,标准委员会没有把 int 改成 8 字节,而是保持 int 为 4 字节,新增 long long 作为 8 字节整数类型,目的是兼容大量旧代码,避免原有代码溢出。编译器会根据目标编译目标也就是 target,决定 int 的字节宽度,不是根据你电脑 CPU 是 64 位就一定自动把 int 设成 8 字节,这点非常容易踩坑。
判断 int 类型所占字节数的实操步骤
第一步 代码方式,在程序里面写 sizeof int,这个运算符会在当前编译环境,直接返回 int 所占字节数,注意 sizeof 是编译期运算符,大部分情况编译阶段就计算完成
第二步 头文件查询,打开 limits.h,里面 INT_MIN INT_MAX 宏代表 int 最小值最大值,通过位宽反推字节数,如果最大值是 2 的 31 次方减 1,说明是 32 位也就是 4 字节,如果最大值是 2 的 15 次方减 1,就是 16 位也就是 2 字节
第三步 确认编译目标,查看编译器选项,比如 gcc 的 m32 m64 参数,m32 编译出来 int 是 4 字节,在部分特殊嵌入式交叉编译工具链,目标芯片不同,int 字节数会改变
第四步 查阅编译器手册,每种编译器比如 gcc msvc iar 都会在文档写明该工具链下 int 默认宽度,交叉编译项目优先看这份文档,不要直接套用 PC 端经验
常见平台对照表
| 平台与编译器 | int 所占字节数 | 说明 |
|---|---|---|
| 16 位 DOS 老编译器 | 2 字节 | 匹配 16 位 CPU 字长 |
| 32 位 Windows Linux | 4 字节 | 主流经典配置 |
| 64 位 Windows | 4 字节 | int 保持 32 位,long 为 4 字节 |
| 64 位 Linux | 4 字节 | int 保持 32 位,long 为 8 字节 |
| 部分 8 位单片机 | 2 字节 | 嵌入式交叉编译环境 |
补充注意要点
sizeof 返回单位就是字节,1 字节等于 8 位,所以字节数乘以 8 就是 int 的位宽。不要混淆 int long long int short 这几个类型,short 一般固定至少 2 字节,long long 基本是 8 字节,但是 int 是平台可变。跨平台代码如果对宽度有严格要求,推荐使用 stdint.h 里面 int32_t int16_t 这类定宽类型,不再依赖原生 int,避免 int 类型所占字节数在不同环境变化引发 bug。
综合来看,判断 int 类型所占字节数最可靠办法就是当前编译环境执行 sizeof int,同时结合 C 标准最小约束,CPU 字长和编译器目标参数综合确认,不能死记固定 4 字节,跨平台开发一定要意识到 int 是平台相关类型。
【常见问题】
问题 1 int 类型所占的字节数是怎么判断的,为什么 64 位系统 int 还是 4 字节
回答 1 int 类型所占的字节数是怎么判断的,核心不是看操作系统是不是 64 位,而是编译器的设计规范,64 位平台为了兼容历史代码,C 标准没有强制把 int 改成 8 字节,所以主流 64 位环境 int 类型所占字节数依旧是 4 字节
问题 2 int 类型所占的字节数是怎么判断的,sizeof int 得到的值就是最终结果吗
回答 2 int 类型所占的字节数是怎么判断的,在当前编译目标下 sizeof int 得到的值就是该环境 int 类型所占字节数,但是如果切换交叉编译目标,重新编译之后这个数值会发生变化,不能沿用旧环境结果
问题 3 int 类型所占的字节数是怎么判断的,C 语言标准有没有强制规定
回答 3 int 类型所占的字节数是怎么判断的,C 语言标准只规定 int 最小宽度是 16 位也就是最少 2 字节,没有强制固定字节长度,属于平台相关类型,所以需要结合编译器和目标平台判断 int 类型所占字节数
问题 4 int 类型所占的字节数是怎么判断的,嵌入式单片机环境会不一样吗
回答 4 int 类型所占的字节数是怎么判断的,嵌入式单片机使用交叉编译工具链,目标芯片架构和 PC 不同,int 类型所占字节数有可能变成 2 字节,必须查询该编译器手册或者运行 sizeof int 确认
【免责申明】
本内容基于 C 语言通用标准与主流编译器实践讲解,不同厂商自定义扩展编译器,特殊编译选项,未来新标准修订都有可能改变相关定义,本文仅作为编程学习参考,不能替代编译器官方手册与标准原文。


