图片
今天我们要讨论的是计算机如何存储和表示数值数据,也就是说,要谈谈数学!之前,我们谈到了如何用晶体管构建逻辑门来处理和判断布尔表达式。在布尔代数中,只有两个二进制值:真和假。但是如果只有两个值,我们怎么能表示超出这两个值的信息呢?这就涉及到数学了。
一个二进制值可以用来表示一个数字。我们可以称这两个状态为1和0,这其实非常有用。如果想要表示更大的数值,只需添加更多的二进制位。这与我们熟悉的十进制数字的原理完全相同。在十进制中,单个位可以有10种可能值,即0到9,要表示大于9的数就需要在前面加更多的位。我们可以对二进制做同样的事情。
例如,数字263表示什么?这意味着有2个“百位”、6个“十位”和3个“个位”。把这些数加在一起,就得到263。每个列有不同的倍数,在这里是100、10和1,每列的倍数是右边列的10倍,这就是为什么称为“十进制”或“基数10”的原因,因为每列有10种可能的数值(0到9)。
图片
二进制也是一样,只是基数是2,因为二进制只有两个可能的数值:1和0。这意味着每列的倍数是右边列的2倍。例如,二进制数101表示的是1个“4位”、0个“2位”和1个“个位”。把这些数加起来得到的十进制数是5。但要表示更大的数,二进制需要更多的位。
图片
例如二进制数10110111,我们可以把它转换成十进制:1 x 128,0 x 64,1 x 32,1 x 16,0 x 8,1 x 4,1 x 2和1 x 1,这些加起来就是183。用二进制数字进行数学运算也不难。例如,十进制183加上19,先加3 + 9等于12,我们把2作为和并进1到“十位”。然后8加上1和进的1等于10,所以和是0再进1。最后1加上进的1等于2,总和是202。
二进制加法也一样。例如1+1在二进制中等于2,但二进制中没有符号“2”,所以用10表示,把0作为和,再进1。就像在十进制示例中一样。继续操作,我们得出11001010,等于十进制的202。每个二进制位1或0称为“位”(bit)。在这些例子中,我们用的是8位数字,它的最低值是0,最高值是255。
你可能听说过8位电脑或8位图形和音频。这些电脑的大多数操作都是以8位为单位处理的。256种不同的数值不算多,这意味着8位游戏的图形最多有256种颜色。8位在计算中如此常见,以至于有一个特别的名称:字节(byte)。
1字节等于8位。如果有10字节,实际上就是80位。你听说过KB、MB、GB等,这些前缀表示数据的不同量级。就像1千克等于1000克,1千字节等于1000字节,实际上是8000位。兆是百万字节,吉是十亿字节。今天你可能有一个容量为1TB的硬盘,那就是8万亿个1和0。
32位可以表示的最大数值略低于43亿,即32个1组成的二进制数。这就是为什么今天的照片可以如此平滑和美观,因为现代电脑使用32位色彩图形。当然,并非所有数值都是正数。因此,我们需要一种表示正数和负数的方法。
大多数计算机使用第一个位表示符号:1表示负数,0表示正数,然后使用剩下的31位来表示数字本身。这样可以获得大约正负20亿的范围。
尽管这是一个相当大的范围,但对于许多任务来说仍然不够。毕竟,地球上有70亿人,而美国的国债接近20万亿美元。这就是64位数的用处。64位数可以表示的最大值为9,223,372,036,854,775,807!最重要的是,计算机必须在内存中为位置标记地址,以便存储和检索数值。随着计算机内存扩展到千兆字节甚至太字节(即万亿字节),需要使用64位内存地址。
除了正数和负数,计算机还必须处理非整数的数值,例如12.7和3.14。这些被称为“浮点数”,因为小数点可以在数字中浮动。为了表示浮点数,开发了几种方法,其中最常见的是IEEE 754标准。
本质上,这个标准以类似科学计数法的方式存储小数值。例如,625.9可以写作0.6259 x 10^3。这里有两个重要的数值:0.6259称为有效数字,3是指数。在32位浮点数中,第一个位用于数值的符号——正或负。接下来的8位用于存储指数,剩下的23位用于存储有效数字。
我们已经讨论了很多关于数值的内容,但你的名字可能是由字母组成的,所以计算机还需要一种方法来表示文本。不过,计算机并没有为字母设立特别的存储形式,而是简单地使用数字来表示字母。最简单的方法可能是简单地给字母编上号码:A代表1,B代表2,C代表3,以此类推。
事实上,著名的英国作家弗朗西斯·培根在17世纪使用五位序列来编码全部26个英文字母,用于发送秘密信息。而五位可以存储32种可能的数值——足够表示26个字母,但不足以表示标点符号、数字以及大小写字母。
于是ASCII(美国信息交换标准代码)应运而生。ASCII诞生于1963年,是一种7位编码,足够存储128种不同的值。通过这种扩展的范围,它可以编码大写字母、小写字母、数字0到9以及“@”符号和标点符号。例如,小写字母'a’表示为97,而大写'A’表示为65。冒号表示为58,右括号为41。
ASCII甚至包含了一些特殊的控制码,比如换行符,用来指示计算机在下一行开始显示文本。在早期的计算机系统中,如果没有换行符,文本会直接从屏幕边缘继续显示下去!
由于ASCII是一种较早的标准,它得到了广泛的使用,并且至关重要的是,它允许由不同公司制造的计算机互相交换数据。这种通用的信息交换能力称为“互操作性”。然而,ASCII有一个主要的局限性:它实际上只为英语设计。
幸运的是,一个字节有8位,而不是7位,因此很快便流行起来使用128到255的代码(之前未使用的)来表示“国家字符”。在美国,这些额外的代码大多用来编码附加符号,比如数学符号、图形元素以及常见的带重音字符。
另一方面,虽然拉丁字符被普遍使用,俄罗斯的计算机使用这些额外的代码来编码西里尔字母,希腊的计算机则用它们来编码希腊字母,依此类推。而这些国家字符编码在大多数国家中运作得相当良好。
问题在于,如果你在土耳其的计算机上打开一封用拉脱维亚文写的电子邮件,结果会完全无法理解。随着亚洲计算机的兴起,情况变得更为复杂,因为像中文和日文这样的语言有成千上万个字符,根本无法在8位编码中表示!
对此,每个国家都发明了多字节的编码方案,但这些方案彼此之间并不兼容。日本人对这种编码问题非常熟悉,以至于他们有一个特别的词来描述这种乱码问题:mojibake,意思是“乱码”。
于是Unicode诞生了——一种统治一切的格式。Unicode在1992年设计出来,目的是最终替代所有不同的国际编码方案,用一种通用的编码方案取而代之。Unicode最常见的版本使用16位,空间足够容纳超过一百万种编码——足以覆盖每一种曾经使用过的语言的所有字符——超过12万个字符,涉及100多种文字书写方式,还有为数学符号甚至是表情符号预留的空间。
就像ASCII定义了一种将字母编码为二进制数的方案一样,其他文件格式(如MP3或GIF)也使用二进制数来编码我们照片、电影和音乐中的声音或像素的颜色。最重要的是,在底层,这一切最终都归结为长长的比特序列。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。