int类型取值范围不固定,取决于编译器和平台;主流环境中为32位有符号整数,范围是-2147483648至2147483647,因iso c仅要求至少16位,故早期系统中可为-32768~32767。

int 类型的取值范围不是固定不变的,它取决于具体环境:编译器实现、目标平台字长(如16位/32位/64位系统)以及是否有符号属性。但现代主流环境(如x86-64 Linux/macOS/Windows 上的 GCC、Clang、MSVC)中,int 通常为 32 位有符号整数,取值范围是 -2147483648 到 2147483647。
为什么 int 范围会变化?
ISO/IEC C 标准只要求 int 至少能表示 -32767 到 +32767(即至少 16 位),并未强制规定字节数。因此:
- 在早期 16 位系统或某些嵌入式平台,
sizeof(int) == 2,范围就是 -32768 ~ 32767; - 在绝大多数当前桌面、服务器和移动开发环境中,
sizeof(int) == 4,对应 32 位补码表示; - 注意:即使在 64 位系统上,int 也通常仍是 4 字节——long 或 long long 才可能扩展到 8 字节。
有符号 vs 无符号 int
默认 int 是有符号的(signed),最高位为符号位;加上 unsigned 修饰后,全部位用于数值,范围翻倍且只支持非负数:
-
int(有符号):-2147483648 ~ 2147483647(32 位); -
unsigned int:0 ~ 4294967295(32 位); - 两者存储空间相同(都是 4 字节),只是解释方式不同。
如何确认你环境中的 int 范围?
最可靠的方式是运行代码,而不是依赖经验或文档:
- 包含头文件
<limits.h></limits.h>; - 使用
INT_MIN和INT_MAX宏获取当前编译环境下的确切边界; - 用
sizeof(int)查看实际字节数,再换算位数(×8)。
超出范围会发生什么?
行为取决于语言和上下文:
- C/C++ 中:有符号整数溢出是未定义行为(UB),编译器可任意处理(常见是静默回绕,如 2147483647 + 1 变成 -2147483648);
- MySQL 中:严格模式报错,非严格模式自动截断为边界值;
- Java 中:
int溢出也是回绕(因 Java 规定使用 2 的补码且行为确定); - 务必在关键逻辑(如计数、索引、ID 生成)中做范围校验,尤其对接外部输入或大数运算时。











