复习
- 第一章:需要一台计算机,在研究其组成的方向上进行努力
- 第二章:知道了计算机由输入设备、存储器、运算器和输出设备组成,这个体系目前还在沿用,现在该探究计算机怎样表示数据了
TL;DR
- 计算机使用二进制(0 和 1)表示所有数据,每一个 0 或 1 都是一个二进制位
- 为了表示简洁和方便,采用八进制或十六进制,后二者本质还是把三个或者四个二进制位揉到了一起,用一个新符号表示
- 更大的单位:KB,MB,GB,TB,PB,EB,ZB
正文
在了解了计算机的组成之后,我们需要思考一个关键问题:计算机如何表示和处理各种数据?
数据表示
回想一下,我们目前打算设计的计算机使用电能。而电子元件最容易实现两种状态:通电(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 = 13₁₀ = 1×10¹ + 3×10⁰(右下角的 10 表示采用十进制)
- 二进制的 13:13 = 1101₂ = 1×2³ + 1×2² + 0×2¹ + 1×2⁰(右下角的 2 表示采用二进制)
似乎可以,我们可以试试把二进制和十进制的 0-9 一一对应起来:
二进制 | 十进制 | 二进制 | 十进制 |
---|---|---|---|
0000 | 0 | 0101 | 5 |
0001 | 1 | 0110 | 6 |
0010 | 2 | 0111 | 7 |
0011 | 3 | 1000 | 8 |
0100 | 4 | 1001 | 9 |
要表示更大的数字时,像十进制一样往上叠位数就好了。只是因为二进制只有 2 个数字,而十进制有 10 个数字,所以二进制表示相同的值时,位数要更多一些。
相关约定
为了方便计算机学界交流,这些有专业术语:
- 1 个二进制的 0 或 1 称为 bit,比特,用 b 表示
- 8 个二进制的 0 或 1 成为 Byte,字节,用 B 表示
- 8 是人为规定的,二进制表示一个数据会非常长,表示 0-9 都需要 4 个 bit
- 16 个 bit 为 Halfword,半字,用 H 表示(字和半字的概念以后会讲)
- 32 个 bit 为 Word,字,用 W 表示(字和半字的概念以后会讲)
二进制太长,不方便阅读,人们又将 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)
- 如
0x0
,0X0
,0h
,0H
八进制(Octal,简称 Oct):
- 采用符号(8 个):0, 1, 2, 3, 4, 5, 6, 7
- 表示方法:前缀(0o / 0O)+ 值,或者 值 + 后缀(o / O)
- 如
0o0
,0O0
,0o
,0O
二进制(Binary,简称 Bin)其实也有相应的表示方法,同上:
- 采用符号(2 个):0, 1
- 表示方法:前缀(0b / 0B)+ 值,或者 值 + 后缀(b / B)
- 如
0b0
,0B0
,0b
,0B
十进制(Decimal,简称 Dec)不加任何前后缀。
下面是对照表(需要表示的值以十进制表示):
十进制值 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0b0000 或 0000b | 0o00 或 00o | 0x0 或 0h |
1 | 0b0001 或 0001b | 0o01 或 01o | 0x1 或 1h |
2 | 0b0010 或 0010b | 0o02 或 02o | 0x2 或 2h |
3 | 0b0011 或 0011b | 0o03 或 03o | 0x3 或 3h |
4 | 0b0100 或 0100b | 0o04 或 04o | 0x4 或 4h |
5 | 0b0101 或 0101b | 0o05 或 05o | 0x5 或 5h |
6 | 0b0110 或 0110b | 0o06 或 06o | 0x6 或 6h |
7 | 0b0111 或 0111b | 0o07 或 07o | 0x7 或 7h |
8 | 0b1000 或 1000b | 0o10 或 10o | 0x8 或 8h |
9 | 0b1001 或 1001b | 0o11 或 11o | 0x9 或 9h |
10 | 0b1010 或 1010b | 0o12 或 12o | 0xA 或 Ah |
11 | 0b1011 或 1011b | 0o13 或 13o | 0xB 或 Bh |
12 | 0b1100 或 1100b | 0o14 或 14o | 0xC 或 Ch |
13 | 0b1101 或 1101b | 0o15 或 15o | 0xD 或 Dh |
14 | 0b1110 或 1110b | 0o16 或 16o | 0xE 或 Eh |
15 | 0b1111 或 1111b | 0o17 或 17o | 0xF 或 Fh |
数据大小单位
在计算机中,数据大小的单位遵循二进制的特点:
- 1 KB (Kilobyte) = 1024 B = 2¹⁰ B
- 1 MB (Megabyte) = 1024 KB = 2²⁰ B
- 1 GB (Gigabyte) = 1024 MB = 2³⁰ B
- 1 TB (Terabyte) = 1024 GB = 2⁴⁰ B
注意:这里的 1024(2¹⁰)而不是 1000(10³)是因为计算机使用二进制。
有趣的是,所有存储厂商使用和标注的 1 KB 并不是 1024 B,而是 1000 B,其他 MB 等单位同理。所以每个厂商标注 1 TB 或者 256 GB 等存储单位的硬盘容量,实际上比计算机认为的 1 TB 或 256 GB 要小一些。所以硬盘插上电脑之后,操作系统识别出来的硬盘容量总会比厂商标注的容量要小一些。这不是偷工减料,而是底数不相同。
特别注意
说了这么多进制可能有点晕。其实主要只有十进制与二进制。
八进制和十六进制其底层还是二进制,因为目前只有通电或断电两种状态。 使用是否通电理解二进制并不严谨,但于初学者而言容易理解且偏差不大(苏联曾经诞生过三进制计算机,但由于各种原因,并没有取代二进制成为现代计算机的基础)。
- 1 个八进制可以拆成 3 个二进制位,因为 8 = 2³
- 1 个十六进制可以拆成 4 个二进制位,因为 16 = 2⁴
只是因为 1101₂ 看起来不如 15₈ 和 D₁₆ 简洁(右下角表示进制),其中十六进制最简洁,只用 D 表示就可以了。
注意:上面的符号 A-F 只是人们的约定俗成,其实完全可以用其他符号表示。而至于怎样真正表示 字母形式的 A-F ,以后再说。
二进制的重要性
计算机采用二进制(0 和 1)表示数据有几个重要原因:
- 硬件实现简单:电路的开和关、高电平和低电平可以直接对应 1 和 0
- 运算规则简单:二进制的运算规则比十进制简单得多
- 可靠性高:区分两种状态比区分多种状态更稳定可靠
思考题
如果未来发生了一场能源革命,发现一种新能源:另能。另能激活时,有 A、B、C 三种不同的形态,均可导通另路(类似电路)。
那么计算机是否会发生革命?如果你是另能计算机设计者,会采用几进制?
最后,冯·诺伊曼体系结构是否会随着技术发展而打破?
小结
知识点
- 二进制
- 八进制
- 十六进制
- 数据大小单位
参考资料
- Wikipedia(zh):二进制:计算机中的数据表示基础
- 进制转换计算器
- ISO/IEC 80000-13:2008:信息技术中的量和单位
- 《编码:隐匿在计算机软硬件背后的语言》
- 《深入理解计算机系统》第 2 章:信息的表示和处理
- Wikipedia(zh):Сетунь:苏联诞生的三进制计算机。
思考题答案(仅供参考)
- 会。因为元符号数量从 2 个增长为 4 个。
- 4 进制。未导通态 1 个加上导通态 3 个,共 4 个。可以表示为 0-3,此时每 1 位(四进制)可以表示 2 个比特位(二进制)。
- 科学和技术一直在进步。假设,某一天技术强大到所有输入和输出均可一个设备完成,则该体系也会随之淘汰。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪
本文由博客一文多发平台 OpenWrite 发布!