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

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

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

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

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

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

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

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

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

在这里插入图片描述
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 好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。
    在这里插入图片描述
    同样的文本,采用不同的编码存储下来,如果另外一个程序,用一种不同的编码方式来进行解码和展示,就会出现乱码。在中文世界里,最典型的就是“手持两把锟斤拷,口中疾呼烫烫烫”的典故。
  • 首先,“锟斤拷”的来源是这样的。如果我们想要用 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 又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了

总结

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的:利用Logisim软件设计实现计数器和5位编码器。 实验原理:计数器是一种用于计数的电路,它可以根据输入的时钟信号逐次增加计数值。5位编码器是一种用来将数字转化为二进制码的电路。它通常用于数字信号的处理和传输。 实验步骤: 1. 打开Logisim软件,选择“new circuit”新建电路; 2. 在电路中添加3个输入端口:一个时钟信号,一个启动信号,一个复位信号; 3. 选中“Gates”选项,添加“AND门”和“NOT门”; 4. 将时钟信号和启动信号分别接入AND门中; 5. 在AND门的输出端接入一个D触发器,其CLR(清零)端接入复位信号; 6. 将D触发器的输出端与一个4位计数器相连,以实现计数功能; 7. 点击“Simulate”按钮测试设计的计数器是否有效; 8. 添加5个输出端口及5个LED灯,表示输出的二进制码; 9. 将计数器的输出信号分别接入编码器的输入端口,以实现数字信号到二进制码的转换; 10. 点击“Simulate”按钮测试设计的编码器是否有效。 实验结果: 设计得到的计数器可以逐次增加计数值,并且可以通过启动信号和复位信号控制计数器的运行。 设计得到的5位编码器可以将数字信号转换成为二进制码,并可以通过LED灯显示输出的二进制码。 实验思考: 1. 在实验中如何通过输入端口控制计数器的启动和复位? 通过给计数器设计两个输入端口:一个是启动信号,一个是复位信号。在计数器的设计中,将启动信号开启时钟信号的传输,使得计数器开始工作;将复位信号传入D触发器的CLR端口,并将计数器的值清零。 2. 如何将计数器输出的数字信号转化为二进制码? 通过使用编码器来实现数字信号到二进制码的转换。计数器的输出信号分别接入编码器的输入端口,由编码器将输出的数字信号转化成为对应的二进制码,并且输出到LED灯上显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值