智享教程网
白蓝主题五 · 清爽阅读
首页  > 日常经验

整数在内存里到底是怎么存的?

写代码时经常用 intshortlong,但你有没有想过:这些数字真正在电脑里长啥样?不是十进制的 123,也不是带符号的 -5,而是一串 0 和 1——这就是整数类型的存储方式。

先看个最简单的例子

假设你在 C 语言里写了这么一句:

int a = 5;
电脑不会记“5”这个字,而是把它转成二进制:101,再补足到 32 位(常见 int 长度):
00000000 00000000 00000000 00000101
(空格只为方便阅读,实际连续)

负数怎么存?不是加个减号就完事

比如 int b = -5;内存里可没“-”号的位置。主流用的是补码表示法:先算 5 的二进制(同上),再取反(0 变 1,1 变 0),最后加 1。
5 → 0000...0101
取反 → 1111...1010
加 1 → 1111...1011
这就是 -5 在内存里的样子。好处是加减运算电路不用区分正负,统一一套逻辑就能跑。

为什么 short 是 2 字节,int 是 4 字节?

不同整数类型只代表分配多少空间。一个 short 给你 16 位(2 字节),能存 -32768 到 32767;int 给 32 位(4 字节),范围就变成 -2147483648 到 2147483647。多出来的位数,不是“更精确”,只是“能装更大/更小的数”。就像用小饭盒装汤圆 vs 用大盆装汤圆——盆大,能放的汤圆数量上限高,但每个汤圆本身没变。

无符号数:把“负号位”也拿来当数字用

unsigned int 就是把最高位那个原本表示正负的“符号位”,也当成数值位来用。同样是 32 位,int 最大是 2147483647,而 unsigned int 最大直接翻倍到 4294967295。适合存年龄、ID、数组下标这类天然不会为负的数。

一个小坑:类型混用时的隐式转换

比如:

unsigned int u = 1;
int i = -2;
if (u < i) { ... }
你以为 -2 比 1 小,结果这条件永远不成立。因为比较前,i 会被提升为 unsigned int,-2 就变成了 4294967294(补码解释为无符号值),自然比 1 大得多。这不是 bug,是存储方式和类型规则共同作用的结果。