知用网
白蓝主题五 · 清爽阅读
首页  > 电脑技巧

整数类型内存占用:别小看这些数字,它们在内存里可不轻

写程序的时候,大家可能都用过 int、short、long 这些整数型。但你有没有想过,它们到底在内存里占了多少地方?这可不是小事,尤其在处理大量数据时,一个类型选错,内存用量可能差好几倍。

常见的整数类型和它们的“体重”

在 C/C++ 这类语言里,整数类型的大小是固定的,由编译器和系统架构决定。比如在 64 位 Windows 系统上,常用的类型占用如下:

  • char:1 字节(8 位)
  • short:2 字节(16 位)
  • int:4 字节(32 位)
  • long:4 字节(32 位,Windows 上)
  • long long:8 字节(64 位)

注意,long 在不同系统上可能不一样。Linux 64 位下,long 是 8 字节,而 Windows 是 4 字节。这种差异很容易让人踩坑。

举个实际例子

假设你要存 100 万个学生的年龄。年龄最大也就 200 岁以内,用 short(-32768 到 32767)完全够用。如果傻乎乎地全用 int,每个数多占 2 字节,总共就是 100 万 × 2 = 200 万字节,差不多白白多用了 2MB 内存。

再狠一点,如果是个嵌入式设备,内存只有几 MB,这种浪费就真扛不住了。

代码里怎么查?

不确定某个类型的大小?直接用 sizeof 就行:

#include <stdio.h>
int main() {
    printf("int: %zu 字节\n", sizeof(int));
    printf("short: %zu 字节\n", sizeof(short));
    printf("long long: %zu 字节\n", sizeof(long long));
    return 0;
}

输出结果会告诉你当前平台下的真实占用。

别忘了无符号类型

有时候你确定不会存负数,比如计数、ID 编号,就可以用 unsigned int 或 unsigned short。它们的范围变成从 0 开始,能表示更大的正数,而且内存占用不变。

比如,一个 byte 的 char 范围是 -128 到 127,而 unsigned char 就是 0 到 255,刚好适合存像素值、状态码这类数据。

编程语言之间的差异

Java 就比较省心,int 固定 4 字节,long 固定 8 字节,不管什么平台都一样。Python 则更灵活,int 类型可以自动扩展,但代价是每个整数对象本身有额外开销,远不止几个字节。

所以 Python 处理一亿个整数时,内存暴涨并不稀奇——每个数背后都是个对象,附带引用计数、类型指针等信息。

小选择,大影响

别觉得省几个字节没啥用。当你在做高频交易系统、游戏服务器、物联网设备时,内存效率直接关系到响应速度和硬件成本。一个 int 换成 short,数组小一半,缓存命中率提升,性能自然上来。

下次定义变量前,不妨多问一句:这个数真的需要 4 字节吗?