int 是 C 语言里面最常用的有符号基本整型,绝大多数编译器里面 int 占 4 个字节也就是 32 位,取值范围是负 2 的 31 次方到正 2 的 31 次方减 1,也就是 - 2147483648 到 2147483647,这里一定要记住上限是 2 的 31 次方减 1,原因是 32 位里面最高一位是符号位,0 代表正数,1 代表负数,剩下 31 位用来存储数值,正数最大值要减去 1,这个考点是计算机二级 C 语言考试必考内容,但是 int 并不是固定永远 4 字节,它的字节长度由编译器和操作系统决定,早期 16 位平台 int 是 2 字节,取值范围就变成 - 32768 到 32767,所以写代码的时候不能死记一个数值,要理解背后原理,如果需要固定长度的整型,推荐使用 stdint.h 里面的 int32_t 这类类型,避免跨平台兼容问题,当数值超过 int 取值的范围,就会发生整数溢出,溢出之后数值会变成异常结果,不会自动报错,这也是编程里面非常隐蔽的 bug。
一 核心原理说明
int 属于有符号整型,采用补码存储
总位数 32 位
最高位 符号位
正数区间 0 到 2147483647
负数区间 -2147483648 到 -1
总可表示数字个数 2 的 32 次方个
二 不同平台 int 取值范围对照表
| 类型 | 字节数 | 位数 | 取值范围 |
|---|---|---|---|
| int 32 位平台 | 4 字节 | 32 位 | -2147483648 ~ 2147483647 |
| int 16 位平台 | 2 字节 | 16 位 | -32768 ~ 32767 |
| unsigned int 无符号 | 4 字节 | 32 位 | 0 ~ 4294967295 |
重点区分,unsigned int 是无符号 int,没有符号位,全部位都存数字,最小值是 0,不存在负数,很多初学者会把有符号 int 和无符号 int 取值范围搞混。
三 相关配套整型范围拓展
short 短整型,一般 2 字节,范围 -32768 ~ 32767
long 长整型,32 位系统一般 4 字节,64 位系统一般 8 字节
long long 长长整型,固定 8 字节,范围 -9223372036854775808 ~ 9223372036854775807
四 整数溢出问题
当赋值或者计算结果超过 int 取值的范围,就会发生溢出
举例 int a = 2147483647,再加 1 之后,不会变成 2147483648,而是变成 -2147483648
溢出属于未定义行为,不同编译器表现有可能不一样,程序不会主动弹出错误提示,很容易造成逻辑错误
解决办法 预估数值大小,如果数值会超过 int 取值范围,改用 long long 类型,或者使用无符号 unsigned int
五 编程实操要点
可以使用头文件 limits.h 里面的宏,直接调用系统定义的 int 上下限
INT_MAX 代表 int 最大值 2147483647
INT_MIN 代表 int 最小值 -2147483648
代码示例
include
printf ("% d", INT_MAX);
这个写法跨平台,不需要手动写死数字,推荐正式项目使用
六 常见误区
误区一 int 永远是 4 字节,这个是错误,int 长度由平台决定,只是现在主流电脑都是 32 位 int
误区二 int 最大值是 2 的 31 次方,正确是 2 的 31 次方减 1,考试填空经常在这里挖坑
误区三 int 溢出程序会报错,实际 C 语言不会主动报错,属于未定义行为
误区四 unsigned int 也可以存负数,无符号 int 没有符号位,赋值负数会转换成很大的正数
【常见问题】
问题 1 int 取值的范围,为什么最大值是 2147483647 而不是 2147483648
回答 1 int 取值的范围里面,int 是 32 位有符号整型,最高位是符号位,只有 31 位用来存数值,所以正数最大值是 2 的 31 次方减 1,也就是 2147483647,这就是 int 取值的范围上限的由来。
问题 2 int 取值的范围,16 位平台 int 是多少
回答 1 int 取值的范围会随平台变化,16 位平台 int 占 2 字节,int 取值的范围是 - 32768 到 32767,和现在主流 4 字节 int 的 int 取值的范围不一样。
问题 3 int 取值的范围,超过 int 取值的范围会怎么样
回答 1 如果计算结果超过 int 取值的范围,会发生整数溢出,数值变成异常结果,C 语言不会自动报错,属于未定义行为,数值过大的时候要更换 long long 类型。
问题 4 int 取值的范围,unsigned int 和普通 int 取值的范围有什么区别
回答 1 int 取值的范围是有符号,可以存储负数,unsigned int 是无符号版本,没有符号位,int 取值的范围变成 0 到 4294967295,不能保存负数。
【免责申明】
本文内容为 C 语言 int 取值范围编程科普,仅用于考试学习参考,不同编译器 操作系统对 int 字节长度定义存在差异,具体数值以当前开发环境 limits.h 宏定义为准,本文不构成工业级项目编码规范标准。


