刚学 C 的人几乎都会被这一行绊一下:int a = 3.9,打印出来是 3,不是 4。问老师,老师说整型只能存整数。这话没错,但没解释为什么不是四舍五入,也没说超出范围会怎样。

整型就是没有小数部分的数

编程语言里的整数类型,用来存 -3、0、42 这种不带小数点的值。赋值时小数部分被直接截掉,不是四舍五入,所以 3.9 变 3,-3.9 变 -3。想四舍五入得自己加 0.5 或者调 round 函数,别指望编译器帮你。

范围是固定的,超了就绕回去

常见的 int 占 4 字节、32 位,范围是 -2147483648 到 2147483647,加一就变成最小值,这叫溢出。有符号整数的溢出在 C 里属于未定义行为,编译器怎么优化都有可能,别指望它稳定绕回。无符号类型 unsigned int 的范围是 0 到 4294967295,溢出是明确定义的取模,但仍然会算错。

长度不一样,别乱选

  • short:通常 2 字节,能存到三万多,嵌入式和协议解析里省内存用。
  • int:通常 4 字节,日常默认。
  • long long:至少 8 字节,存时间戳、文件大小、ID 用它。
  • char:1 字节,也能当小整数用,但有没有符号在不同编译器上不一样。

long 在 32 位和 64 位 Windows 上都是 4 字节,在 Linux 64 位上却是 8 字节。跨平台代码别假设 long 的长度,需要定长就用 stdint.h 里的 int32_t、uint64_t。

除法是另一个坑

两个整数相除,结果还是整数,直接截断。5 除以 2 得 2,不是 2.5。想要小数,至少一边得转成浮点。整数除以零会直接崩,不像浮点那样得到无穷大。取模对负数的处理各语言不同,C 里 -7 取模 3 得 -1,Python 得 2,跨语言搬逻辑时要注意。

不是所有语言的整型都这样

Python 的 int 是任意精度,多大都能存,代价是慢一些。JavaScript 的 Number 其实是双精度浮点,安全整数上限是 2 的 53 次方,后端返回超过这个值的 ID 会精度丢失,得改成字符串传。数据库的 bigint 和 int 也是同一个道理,订单号别用 int 存。

怎么判断该用哪种

先问这个值会不会超百万、会不会出现负数、要不要跨语言传输。三个都否,int 足够。有一个是,往上加一档。拿不准就上 64 位有符号,多占四字节换来的稳定性很划算。

取舍:能确定范围就用够用的最小类型,省内存也少出错;不确定的一律上 64 位,为省几个字节去赌溢出不值得。