计算机组成原理:二进制编码

计算机中,有句话叫做“程序=算法+数据结构”。如果对应到组成原理或者说硬件层面,算法就是各种“计算机指令”,书籍结构就是“二进制数据”。

众所周知,现代计算机都是用0和1组成的二进制,来表示所有的信息。

  • 程序指令用到的机器码,是使用二进制表示的
  • 存储在内存里面的字符串、整数、浮点数也都是用二进制表示的。

万事万物在计算机里都是 0 和 1,所以呢,搞清楚各种数据在二进制层面是怎么表示的,是我们必备的一课。

理解二进制的“逢二进一”

二进制和我们平时用的十进制,其实并没有什么本质区别,只是平时我们是“逢十进一”,这里变成了“逢二进一”而已。每一位,相比于十进制下的 0~9 这十个数字,我们只能用0 和 1 这两个数字。

字符串的表示,从编码到数字

不仅数值可以用二进制表示,字符乃至更多的新都能用二进制表示。最典型的例子就是字符串。最早字符串只需要使用英文字符,加上数字和一些特殊符号,然后用8位的二进制,就能表示我们日常需要的所有字符了,这个就是我们常说的ASCII码。

计算机组成原理:二进制编码_第1张图片
ASCII码就好比一个字典,用8位二进制中的128个不同的数,映射到128个不同的字符里。比如,小写字母 a 在 ASCII 里面,就是第 97 个,也就是二进制的 0110 0001,对应的十六进制表示就是 61。而大写字母 A,就是第 65 个,也就是二进制的 0100 0001,对应的十六进制表示就是 41。

在 ASCII 码里面,数字 9 不再像整数表示法里一样,用 0000 1001 来表示,而是用 00111001 来表示。字符串 15 也不是用 0000 1111 这 8 位来表示,而是变成两个字符 1 和 5连续放在一起,也就是 0011 0001 和 0011 0101,需要用两个 8 位来表示

我们可以看到,最大的32位整数,就是2147483647。如果用整数表示法,只需要32位就能表示了。但是如果用字符串来表示,一共有10个字符,每个字符用8位的话,需要整整80位。比起整数表示法,要多占用空间。

这也是为什么,很多时候我们在存储数据的时候,要采用二进制序列化这样的方式,而不是简单的把数据通过CSV或者JSON,这样的文本格式存储来进行序列化。不管是整数也好,浮点数也好,采用二进制序列化会比存储文本省下不少空间。

ASCII码只表示了128个字符,一开始足以满足需求,毕竟计算机是在美国发明的。然而随着越来越多的国家都用上了计算机,想表示比如中文这样的文本,128个字符显然是不够用的。于是,计算机工程师们开始各显神通,给自己的国家创建了对应的字符集(charset)字符编码(character encoding)。

  • 字符集,表示的可以是一个字符的集合。比如“中文”就是一个字符集,不过这样描述一个字符集并不准确。想要更精确一点,我们可以说,“第一版《新华字典》里面出现的所有汉字”,这是一个字符集。这样,我们才能明确知道,一个字符在不在这个集合里面。比如,Unicode就是一个字符集,其中包含了150中语言的14万个不同的字符。
  • 字符编码,则是对于这些字符集里的这些字符,怎么用二进制表示出来的一个字典。比如Unicode就可以用UTF-8、UTF-16,UTFP-32等进行编码,存储成二进制。所以,有了Unicode,其实我们可以用不止 UTF-8 一种编码形式,我们也可以自己发明一套 GT-32 编码,比如就叫作 Geek Time 32 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。
    计算机组成原理:二进制编码_第2张图片
    同样的文本,采用不同的编码存储下来,如果另外一个程序,用一种不同的编码方式来进行解码和展示,就会出现乱码。在中文世界里,最典型的就是“手持两把锟斤拷,口中疾呼烫烫烫”的典故。
  • 首先,“锟斤拷”的来源是这样的。如果我们想要用 Unicode 编码记录一些文本,特别是一些遗留的老字符集内的文本,但是这些字符在 Unicode 中可能并不存在。于是,Unicode 会统一把这些字符记录为 U+FFFD 这个编码。如果用 UTF-8 的格式存储下来,
    就是\xef\xbf\xbd。如果连续两个这样的字符放在一起,\xef\xbf\xbd\xef\xbf\xbd,这个时候,如果程序把这个字符,用 GB2312 的方式进行 decode,就会变成“锟斤拷”。这就好比我们用 GB2312 这本密码本,去解密别人用 UTF-8 加密的信息,自然没办法读出有用的信息。
  • 而“烫烫烫”,则是因为如果你用了 Visual Studio 的调试器,默认使用 MBCS 字符集。“烫”在里面是由 0xCCCC 来表示的,而 0xCC 又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了

总结

我们可以用二进制编码的方式,表示任意的信息。只要建立起字符集和字符编码,并且得到大家的认同,我们就可以在计算机里面表示这样的信息了

你可能感兴趣的:(计算机理论与基础,数据结构)