c 语言 int 占几个字节并不是固定死值,标准 c 语言只规定 int 至少为 2 个字节,主流 32 位和 64 位操作系统平台下 int 默认都是 4 个字节,也就是 32 位,取值范围是负 2 的 31 次方到正 2 的 31 次方减 1,很多初学者会误以为 64 位系统 int 就变成 8 字节,这个是非常普遍误区,int 大小由编译器和数据模型决定,不是单纯由 CPU 位数决定,64 位系统下绝大多数编译器仍然保持 int 为 4 字节,long 类型才会在部分 64 位平台变成 8 字节,理解这点要明白 c 语言标准设计思路,int 设计目标是适配 CPU 原生字长,兼顾运算效率,所以不同平台历史上出现过 16 位时代 int 是 2 字节,32 位时代 int 是 4 字节,现代嵌入式单片机部分编译器 int 依然是 2 字节,写跨平台代码不能写死 int 字节数,推荐使用 sizeof 运算符直接获取当前环境下 int 占几个字节,这是最稳妥的办法。之所以会有平台差异,是因为 c 语言标准没有强制锁定 int 固定字节长度,只给出最小下限,把具体大小交给编译器实现,这样可以适配不同硬件 CPU,保证整数运算在该硬件上效率最优。实际使用第一步新建测试代码,引入 stdio.h 头文件,第二步写主函数,调用 sizeof (int),第三步用 printf 打印这个结果,第四步编译运行,就能得到当前编译器环境 int 占几个字节,第五步根据得到的字节数推算 int 可存储数值范围,第六步如果需要固定字节长度,改用 stdint.h 里面 int32_t int16_t 这类定长类型,避免跨平台移植出错,最后做边界测试,验证数值溢出现象,理解 int 有符号溢出之后的异常表现。
一 标准规定与主流平台数值
ANSI C 标准规定
int 至少占用 2 字节,也就是最小不能小于 16 位,标准没有强制必须是 4 字节
主流平台
16 位 DOS TC 编译器 int 2 字节
32 位 Windows Linux int 4 字节
64 位 Windows int 4 字节
64 位 Linux int 4 字节
8 位单片机部分编译器 int 2 字节
二 4 字节 int 取值范围
4 字节也就是 32 位有符号 int
最小值 负 2147483648
最大值 2147483647
如果数值超过这个上下限,就会发生整数溢出,溢出之后数值回绕,程序出现错误结果,c 语言标准里面有符号整数溢出属于未定义行为
三 测试代码
include
int main()
{
printf("int占 %d 个字节\n", sizeof(int));
return 0;
}
四 相关整型对比表
| 类型 | 主流 32 64 位平台字节数 | 备注 |
|---|---|---|
| char | 1 字节 | 永远固定 1 字节 |
| short | 2 字节 | 标准规定至少 2 字节 |
| int | 4 字节 | 平台可变,至少 2 字节 |
| long | 4 或者 8 字节 | 64 位 Linux 为 8 字节 |
| long long | 8 字节 | 标准固定至少 8 字节 |
五 重点注意事项
1 sizeof 返回的是字节数量,单位是字节,不是 bit,1 字节等于 8 位
2 不要混淆 CPU 位数和 int 字节数,64 位 CPU 不等于 int 是 8 字节
3 跨平台项目如果必须保证固定 32 位整数,优先使用 stdint.h 的 int32_t,不要直接依赖 int 占几个字节
4 int 默认是有符号类型,如果要无符号整数,需要写 unsigned int,无符号 4 字节取值范围是 0 到 4294967295
5 嵌入式开发经常遇到 int 为 2 字节,移植电脑端代码的时候很容易因为 int 占几个字节不同,出现数值溢出 bug
【常见问题】
问题 1 c 语言 int 占几个字节,64 位系统是不是 int 变成 8 字节
回答 1 c 语言 int 占几个字节在主流 64 位 Windows 和 Linux 编译器仍然是 4 字节,并不是 8 字节,c 语言 int 占几个字节由编译器数据模型决定,不是 CPU 位数,long 类型才会在 64 位 Linux 变成 8 字节。
问题 2 c 语言 int 占几个字节能不能写死成 4 字节用于跨平台代码
回答 1 c 语言 int 占几个字节标准没有强制固定,部分嵌入式编译器 c 语言 int 占几个字节是 2 字节,直接写死 4 字节会造成移植 bug,跨平台代码推荐使用 stdint.h 定长类型,不要依赖 int 占几个字节。
问题 3 c 语言 int 占几个字节怎么在代码里面自动获取
回答 1 c 语言 int 占几个字节可以直接使用 sizeof (int) 运算符获取,sizeof 是编译期运算符,可以直接打印当前编译环境下 c 语言 int 占几个字节,是验证 c 语言 int 占几个字节最准确的方法。
【免责申明】
本内容 c 语言 int 占几个字节讲解仅用于编程学习参考,不同编译器硬件平台实现存在差异,正式项目开发请结合目标平台编译测试,遵循 ANSI C 标准,因默认认定 int 固定字节造成移植溢出问题,使用者自行承担相关责任。


