01数字在电脑里是什么样子?

我们看到的数字可能是 13、-5、3.14。 但电脑内存里不会摆着一个“13”形状的小卡片。

计算机会按照数据类型和编码规则, 把数值表示成一串 Bit,也就是 0 和 1 的组合。

人看到的数字

例如 13

按照规则表示

例如使用 8 位无符号整数

00001101

内存中的 Bit

这串 Bit 在该规则下表示 13

02正整数怎样保存?

对于非负整数,最容易理解的方法就是: 把这个数写成二进制。

例如十进制的 13:

十进制 13
=
8 + 4 + 1
=
二进制 1101₂

如果规定它必须占 8 Bit,就在前面补 0:

8 位无符号整数 00001101

03为什么数字要占固定数量的 Bit?

计算机处理数据时,必须知道一段数据有多长。 所以整数类型通常会规定固定的位宽(bit width)

8 Bit 2⁸ = 256

无符号时可表示 0~255

16 Bit 2¹⁶

一共有 65,536 种 Bit 组合

32 Bit 2³²

可以表示约 42.9 亿种不同组合

64 Bit 2⁶⁴

组合数量非常巨大

无符号整数来说, n 个 Bit 可以表示从 0 到 2ⁿ - 1

8 Bit unsigned:0 ~ 2⁸ - 1 = 255

04负数怎样保存?

如果只会表示 0 和正数,还不够。 程序也需要保存 -1、-5、-100 这样的负数。

现代计算机里,有符号整数通常使用 二进制补码(two's complement)

8 位整数中的 +5 00000101
每一位取反 11111010
再加 1 11111011
8 位补码中的 -5 11111011

在 8 位二进制补码中: -128 ~ 127 都能表示。

-128
0
127

05小数怎样保存?

小数比整数复杂。 现代计算机常用浮点数(floating-point)来表示很大范围内的实数近似值。

常见的 IEEE 754 浮点格式,会把一串 Bit 分成几个部分, 用来表示符号、有效数字和指数

符号 正还是负
指数 数量级有多大
有效数字部分 保存数值的重要精度信息

很多十进制小数不能用有限个二进制位精确表示。 例如常见二进制浮点格式中的 0.1 往往只是一个非常接近 0.1 的近似值。

06同一串 Bit 为什么能有不同含义?

一串 Bit 本身只是一种模式。 它到底表示什么,必须看数据类型和解释规则

01000001

当作无符号整数

65

按 ASCII 解释

A

当作原始 Bit

01000001

07数字会不会“装不下”?

会。 因为固定数量的 Bit 只能提供有限数量的组合。

8 Bit 无符号整数 最大只能表示 255 11111111₂

如果还想再加 1 呢?

结果取决于语言、类型和运行环境的规则,不能简单假设“自动变成更大的盒子”。

浮点数还有另一个问题: 不仅范围有限,精度也有限。 有些数虽然在范围内,也只能保存近似值。

范围 Range

能表示的数最大、最小能到哪里

精度 Precision

能把数表示得多细、多准确

你已经知道了什么

  • 电脑里的数字最终会按照某种规则表示成一串 Bit。
  • 非负整数可以直接按照二进制位值来表示。
  • 整数通常有固定的位宽,例如 8、16、32 或 64 Bit。
  • n 位无符号整数通常可以表示 0 到 2ⁿ - 1。
  • 现代计算机里的有符号整数通常采用二进制补码,而不是简单“最高位当负号”。
  • 小数常用浮点数表示,常见格式遵循 IEEE 754,并且很多十进制小数只能近似保存。
  • 同一串 Bit 可以按不同规则解释,因此数据类型和编码规则非常重要。
  • 固定宽度意味着数字有范围限制;浮点数除了范围限制,还存在精度限制。

下一个问题: 数字已经能住进电脑里了, 那英文字母 A、B、C 又是怎样变成数字保存的? 下一篇:字母是怎样变成数字的?