Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

计算机的数据表示

复习

  • 计算机的历史:计算机从算盘、机械计算机发展到电子计算机,核心动力是让繁琐计算自动化
  • 计算机的构成:计算机需要输入、输出、存储和处理功能;CPU 内的 ALU、控制器和寄存器共同处理指令和数据

TL;DR

  • 计算机使用二进制(0 和 1)表示所有数据,每一位 0 或 1 叫作一个二进制位(bit)
  • 二进制、八进制、十六进制本质相同,只是把若干个二进制位揉成一个新符号,更简洁,便于书写和阅读
  • 1 位八进制 = 3 个二进制位,1 位十六进制 = 4 个二进制位

正文

  在了解了计算机的组成之后,我们需要思考一个关键问题:计算机如何表示和处理各种数据?

为什么是二进制

  回想一下,我们目前打算设计的计算机使用电能。而电子元件最容易实现两种状态:通电(1)和断电(0)。

  这天然就是 2 种状态。

  我们目前使用十进制,因为我们的手指和脚趾刚好各有 10 个,有 10 个状态,逢 10 进 1。玛雅人采用 20 进制;有些单位(一打)使用 12 进制。

  那么可不可以设计出一种二进制,只有 2 个状态:0 和 1,逢 2 进 1?

  • 十进制:0、1、2、3、4、5、6、7、8、9
  • 二进制:0、1

二进制与十进制

  十进制的计算方式能不能套用到二进制身上呢?

  • 十进制的 13:13₁₀ = 1×10¹ + 3×10⁰(右下角的 10 表示采用十进制)
  • 二进制的 13:1101₂ = 1×2³ + 1×2² + 0×2¹ + 1×2⁰(右下角的 2 表示采用二进制)

  似乎可以,我们可以试试把二进制和十进制的 0-9 一一对应起来:

二进制十进制二进制十进制
0000001015
0001101106
0010201117
0011310008
0100410019

  要表示更大的数字时,像十进制一样往上叠位数就好了。只是因为二进制只有 2 个数字,而十进制有 10 个数字,所以二进制表示相同的值时,位数要更多一些。

  反过来,把十进制转成二进制,也有简单的办法:不断除以 2,记录余数,直到商为 0,再把余数从下往上读。

  • 以 13 为例
    • 13 ÷ 2 = 6 余 1;
    • 6 ÷ 2 = 3 余 0;
    • 3 ÷ 2 = 1 余 1;
    • 1 ÷ 2 = 0 余 1。
  • 把余数从下往上读,得到 1101,正是 13 的二进制表示

  为什么要把余数从下往上读?感兴趣的读者可以自行搜索。因为并非主线内容,这里只是简单做一个提示:在 N = bₙ·2ⁿ + … + b₂·2² + b₁·2¹ + b₀·2⁰ 中,只有 b₀·2⁰ 不能被 2 整除(如果 b₀ = 1),其他位因为都含有 2 的幂,所以都能被整除。

八进制与十六进制

  二进制太长,不方便阅读,人们又将 3 个或 4 个 bit 揉在一起,分别形成八进制和十六进制。

  十六进制(Hexadecimal,简称 Hex):

  • 采用符号(16 个):0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
  • 表示方法:前缀(0x / 0X)+ 值,或者 值 + 后缀(h / H)
  • 0x00X00h0H

  八进制(Octal,简称 Oct):

  • 采用符号(8 个):0, 1, 2, 3, 4, 5, 6, 7
  • 表示方法:前缀(0o / 0O)+ 值,或者 值 + 后缀(o / O)
  • 0o00O00o0O

  二进制(Binary,简称 Bin)其实也有相应的表示方法,同上:

  • 采用符号(2 个):0, 1
  • 表示方法:前缀(0b / 0B)+ 值,或者 值 + 后缀(b / B)
  • 0b00B00b0B

   十进制(Decimal,简称 Dec)不加任何前后缀。

  下面是对照表(需要表示的值以十进制表示):

十进制值二进制八进制十六进制
00b0000 或 0000b0o00 或 00o0x0 或 0h
10b0001 或 0001b0o01 或 01o0x1 或 1h
20b0010 或 0010b0o02 或 02o0x2 或 2h
30b0011 或 0011b0o03 或 03o0x3 或 3h
40b0100 或 0100b0o04 或 04o0x4 或 4h
50b0101 或 0101b0o05 或 05o0x5 或 5h
60b0110 或 0110b0o06 或 06o0x6 或 6h
70b0111 或 0111b0o07 或 07o0x7 或 7h
80b1000 或 1000b0o10 或 10o0x8 或 8h
90b1001 或 1001b0o11 或 11o0x9 或 9h
100b1010 或 1010b0o12 或 12o0xA 或 Ah
110b1011 或 1011b0o13 或 13o0xB 或 Bh
120b1100 或 1100b0o14 或 14o0xC 或 Ch
130b1101 或 1101b0o15 或 15o0xD 或 Dh
140b1110 或 1110b0o16 或 16o0xE 或 Eh
150b1111 或 1111b0o17 或 17o0xF 或 Fh

特别注意

  说了这么多进制可能有点晕。其实主要只有十进制与二进制。

  八进制和十六进制其底层还是二进制,因为目前只有通电或断电两种状态。 使用是否通电理解二进制并不严谨,但于初学者而言容易理解且偏差不大(苏联曾经诞生过三进制计算机,但由于各种原因,并没有取代二进制成为现代计算机的基础)。

  • 1 个八进制可以拆成 3 个二进制位,因为 8 = 2³
  • 1 个十六进制可以拆成 4 个二进制位,因为 16 = 2⁴

  只是因为 1101₂ 看起来不如 15₈ 和 D₁₆ 简洁(右下角表示进制),其中十六进制最简洁,只用 D 表示就可以了。

  注意:上面的符号 A-F 只是人们的约定俗成,其实完全可以用其他符号表示(比如小猫小狗的 emoji 符号)。而至于怎样真正表示 字母形式的 A-F ,以后再说。

二进制的重要性

  计算机采用二进制(0 和 1)表示数据有几个重要原因:

  1. 硬件实现简单:电路的开和关、高电平和低电平可以直接对应 1 和 0
  2. 运算规则简单:二进制的运算规则比十进制简单得多
  3. 可靠性高:区分两种状态比区分多种状态更稳定可靠

思考题

  如果未来发生了一场能源革命,发现一种新能源:另能。另能激活时,有 A、B、C 三种不同的形态,均可导通另路(类似电路)。

  那么计算机是否会发生革命?如果你是另能计算机设计者,会采用几进制?

  最后,冯·诺伊曼体系结构是否会随着技术发展而打破?

小结

知识点

  • 二进制
  • 八进制
  • 十六进制
  • 进制之间的转换

参考资料

  1. Wikipedia(zh):二进制:计算机中的数据表示基础
  2. 进制转换计算器
  3. 《编码:隐匿在计算机软硬件背后的语言》
  4. 《深入理解计算机系统》第 2 章:信息的表示和处理
  5. Wikipedia(zh):Сетунь:苏联诞生的三进制计算机。

思考题答案(仅供参考)

  1. 会。因为元符号数量从 2 个增长为 4 个。
  2. 4 进制。未导通态 1 个加上导通态 3 个,共 4 个。可以表示为 0-3,此时每 1 位(四进制)可以表示 2 个比特位(二进制)。
  3. 科学和技术一直在进步。假设,某一天技术强大到所有输入和输出均可一个设备完成,则该体系也会随之淘汰。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪