int是C++语言中最基础的整数类型,用来存放不带小数点的整数值,比如年龄、数量、编号等。虽然它看起来简单,但不少写了几年C++的人也未必能说清楚int到底占几个字节、取值范围是多少、有符号和无符号有什么区别。想真正掌握int,需要从它的定义、存储方式和常见陷阱几个方面一起理解。

int的定义和基本含义
int是integer(整数)的缩写,属于C++的基本数据类型之一。它用于声明一个可以存放整数的变量,声明的变量只能存储整数部分,小数会被截断而不是四舍五入。例如int a = 3.9;之后,a的值是3而不是4。
从语言标准的角度看,C++标准并没有规定int必须占多少字节,只要求它至少能表示16位的数据范围,并且在short、int、long这几个类型中,存储大小不能小于前者。在实际的开发环境中,现代主流编译器和平台上int通常占4个字节,也就是32位。
声明一个int变量的写法非常直接,看下面的例子:
#include <iostream>
int main() {
int age = 25; // 声明并初始化一个整数变量
int count; // 只声明未初始化,值是不确定的(局部变量)
count = 10; // 之后再赋值
int sum = age + count; // 整数运算,结果还是整数
std::cout << "sum = " << sum << std::endl;
return 0;
}
需要注意的是,函数main()的返回值类型也是int,程序正常结束时返回0,异常时返回非0值,这也是int在C++程序里最常见的一个用途。
int的取值范围和字节数
既然int通常占4个字节共32位,那么它能表示的范围就可以计算出来。对于有符号的int,最高位用作符号位,剩下的31位存放数值,因此范围是-2147483648到2147483647,也就是负的2的31次方到2的31次方减1。可以用<limits>头文件中的工具来验证:
#include <iostream>
#include <limits>
#include <climits>
int main() {
std::cout << "int占用字节数: " << sizeof(int) << std::endl;
std::cout << "int最大值: " << INT_MAX << std::endl;
std::cout << "int最小值: " << INT_MIN << std::endl;
std::cout << "int最大值(std::numeric_limits): "
<< std::numeric_limits<int>::max() << std::endl;
return 0;
}
如果在代码里超过了这个范围,就会发生整型溢出,得到的结果是未定义行为,程序可能输出一个完全意料之外的数。例如2147483647加1,结果通常会是-2147483648,数值直接绕回到了最小值。这一点在处理计数、累加求和或者时间戳时尤其要小心,必要时应该改用更大的类型。
有符号、无符号以及各种整数类型的区别
int默认是有符号的,等价于signed int。如果写成unsigned int,32位全部用来表示数值,范围变成0到4294967295,只能存放非负数,但正数范围扩大了一倍。C++还提供了不同长度的整数类型,方便按需选择,具体的对比如下:
| 类型 | 典型字节数 | 取值范围 |
|---|---|---|
| short | 2 | -32768 到 32767 |
| int | 4 | -2147483648 到 2147483647|
| unsigned int | 4 | 0 到 4294967295 |
| long long | 8 | 约负9.2e18 到 9.2e18 |
还有一个经典的坑:有符号数和无符号数混用时,有符号数会被自动转换为无符号数。比如循环写成for (unsigned int i = 10; i >= 0; i--),当i减到0之后再减1,会变成一个巨大的正数,循环永远结束不了。这类问题在面试和实际项目中都十分常见。
#include <iostream>
int main() {
unsigned int u = 5;
int n = -1;
// n被转换成无符号数,结果是一个很大的正数
if (n < u) {
std::cout << "n小于u" << std::endl;
} else {
std::cout << "n不小于u" << std::endl; // 实际输出这一句
}
return 0;
}
此外,如果对字节数有严格要求,建议使用C++11引入的固定宽度类型,例如int32_t、int64_t,它们声明在<cstdint>头文件中,可以保证在任何平台上占用的位数都一致,避免跨平台时出现范围不一致的问题。
使用int时的几个实用建议
第一,局部int变量一定要初始化。未初始化的局部变量的值是随机的,直接使用会产生难以排查的bug。第二,做除法运算时要清楚,两个int相除结果还是int,小数部分会被直接丢弃,想要得到小数结果必须先把其中一个转成double。
第三,在需要表示超大数值时(比如人口统计、文件大小、毫秒时间戳),优先使用long long而不是靠unsigned int扩大范围,因为有符号类型的运算更不容易踩坑。第四,阅读别人的代码时,如果看到auto推断类型,记得整数常量默认就是int,超出int范围会自动升级,理解这一点对类型推断的结果判断很有帮助。
总结一下,int是C++中表示整数的默认类型,通常占4个字节,取值范围约在正负21亿之间。掌握它的存储原理、溢出行为和类型转换规则,是写出健壮C++代码的基本功,也是进一步理解其他数据类型的起点。