1.4 二进制表示法(Representing Numbers and Letters with Binary)

2022-10-02
3分钟阅读时长

“Everything is number.”by Pythagoras

「万物皆数。」——毕达哥斯拉

1.4.1 二进制

在二进制中,每个符号就是二进制元数字(0/1)中的一个二进制位 (binary digit) 或是称之为一位 (bit)。

二进制基数为 2,位权为 2 的整数次幂。用 0 和 1 这两个数字表示,逢二进一。

$2^0$ $2^1$ $2^2$ $2^3$ $2^4$ $2^5$ $2^6$ $2^7$ $2^8$ $2^9$ $2^{10}$ $2^{11}$
1 2 4 8 16 32 64 128 256 512 1024 2048
$2^{12}$ $2^{13}$ $2^{14}$ $2^{15}$ $2^{16}$
4096 8192 16384 32768 65536

二进制算术加法

计算机中的数据常用 8 位表示,又名 1 字节(1 bit = 1Byte)。8 位二进制可按 3 位为一组(高位补零)转换为八进制:

八进制 二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

1.4.2 进制转换

十进制转二进制则「除基逆序取余」,二进制转十进制则「乘位权后相加」。

二进制转十进制

1.4.3 单位换算

因 $10^3=1000$ 与 $2^{10}=1024$ 是近似值,故在某些时候 KB 所描述的两种含义经常混用(i.e. 1KB = 1000 or 1024 Byte 均正确)。

通常来说描述存储容量或是文件大小时以 2 为底,描述频率或速率时以 10 为底。e.g. 32 位或 64 位计算机是指每次按块处理数据的单块长度位 32b 或 64b(32b 可表示的最大数约为 43 亿,64b 则为 $9.2^{10}$)。

十进制术语 缩写 数值 二进制术语 缩写 数值 数值差别
kilobyte KB $10^3$ kibibyte KiB $2^{10}$ 2%
megabyte MB $10^6$ mebibyte MiB $2^{20}$ 5%
gigabyte GB $10^9$ gibibyte GiB $2^{30}$ 7%
terabyte TB $10^{12}$ tebibyte TiB $2^{40}$ 10%

e.g. 1KB = 1000B = 8000b;1MB = 1000KB etc.

1.4.4 负数与浮点数

为了便于存储数据,计算机将内存中的位置标记称为「位址」(memory addresses)。当硬盘(memory)的容量到达 GB 和 TB 这样上万亿字节的量级时,需要用 32/64 位的数字来表示位址。

地址无需区分数字的正负,在其他情况下则需要区分(银行存款)。此时可用 32 位中的第 1 位标识正负(1 负 0 正),剩下的 31 位表示数字本身(实数),可表示范围为 ±20 亿左右( $-2^{31}$ ~ $2^{31}-1$ )。

非整数因其小数点可以在数字中浮动而称为「浮点数」(Floating Point Numbers),其最常见的表示标准是 IEEE 754 标准。该标准使用类似于科学计数法的方式存储十进制值。

具体表示方法为「浮点数 = 有效位数 × 指数」,以 32 位浮点数为例,第 1 位表示正负,第 2~9 位则表示指数,剩下 23 位存储有效位数。e.g. 625.9 = 0.6259(有效位数)× $10^3$(指数)

IEEE754浮点数表示

1.4.5 字符

英国作家弗朗西斯·培根(Francis Bacon)曾用 5 位序列来编码 26 个英文字母,在 1600s 传递机密信件。5 位最多可表示 $2^5=32$ 个数字,足够容纳英文字母,但无法表示符号与数字以及大小写字母。

弗朗西斯·培根(Francis Bacon)的编码方式

ASCII

ASCII 全称为美国信息交换标准代码(American Standard Code for Information Interchange),于 1963 年发明,使用 7 位代码表示 128 个不同的值。

在 ASCII 中,除了大小写字母、数字以及常用符号之外,还有一些特殊命令符号。比如使用换行符(图中 10)进行换行。

ASCII 码表

ASCII 的出现使得不同公司所制造的设备之间能够交换数据,我们将这种能够通用交换信息的能力称为「互用性」(interoperability)。

ASCII 为英文设计,在其他非英语国家不够通用。因电脑中 1 字节有 8 位,ASCII 中未使用的 128~256 可供各个国家进行再次编码。常见用途如下:

  • 美国:主要用于编码附加符号,如数学符号、图形元素或是常用重音字符。
  • 俄罗斯:用于表示西里尔(Cyrillic)字符。
  • 希腊:表示希腊字母。

Unicode

尽管 ASCII 留有空余编码,但对非拉丁语系的国家仍不适用(比如中国和日本)。因此各国均发明了多字节编码方案,但互不兼容,由此带来新的问题——乱码(因过于常见,在日本甚至有个词 mojibake 表示这种情况)。

Unicode 于 1992 年诞生,采用统一编码方案解决乱码问题。最常见的 Unicode 是 16 位的,可表示的量级达百万,甚至有空位放 Emoji 😉。