面试被问到 int占几个字节,张口就答 4,其实只对了一半。答案取决于你在写什么语言、跑在什么平台上。
C 语言里看编译器
C 标准只规定了 short 不长于 int,int 不长于 long,具体占多少由编译器和平台决定。16 位的老系统上 int 是 2 字节,现在常见的 32 位和 64 位平台上,int占几个字节这个问题答案基本都是 4。想确认,代码里直接写 sizeof(int),调试时看一眼,或者赋给一个变量输出,结果是 4 就对了。顺带一提 unsigned int 宽度不变还是 4 字节,只是范围变成 0 到 4294967295,约 43 亿,没有负数场景时能用得更宽。
4 字节能表示的范围是 -2147483648 到 2147483647,正负 21 亿。存人口数、秒级时间戳都够用,但要存超大文件的字节数,这个范围就会顶到头,得换更宽的类型。
Java 和数据库里是定死的
Java 不玩弹性那套,int 固定 4 字节,范围同样是正负 21 亿,跨平台行为完全一致,没有看编译器这回事。MySQL 的 int 字段也是 4 字节,建表时写的 int(11) 只是显示宽度,不影响实际占多少空间,这一点坑过不少人。
另外注意,int 是基本类型,对应的包装类 Integer 是对象,放进集合里时每个元素占的内存远不止 4 字节,算内存账别按基本类型算。Python 更特殊,整数没有固定字节数,按数值大小自动扩,不用操心溢出,代价是内存开销比固定宽度类型高。
顺手记一下邻居们
- short 一般 2 字节
- long 在 64 位 Linux 下是 8 字节,Windows 下却是 4 字节
- long long 固定 8 字节
- 指针在 64 位系统上占 8 字节
最后提醒一句溢出:两个 int 相加超出范围不会报错,结果直接回绕成负数,编译器不吭声,线上出问题才发现。写计算密集的逻辑时,先估清楚数值上限,拿不准就换更宽的类型。
判断方法很简单:写 C 系代码就信 sizeof 的结果,写 Java 就背 4 字节,写 Python 就别纠结。被追问时把「标准没规定死,看平台和编译器」这句补上,基本就稳了。