其他分享
首页 > 其他分享> > 计算机内部探秘:进制转换、数据存储

计算机内部探秘:进制转换、数据存储

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

计算机内部探秘

进制转换及数据存储
我们生活中一直使用十进制系统,而计算机里面一直用二进制系统。这个系统由科学巨人Leibniz莱布尼茨重新发明并提倡。他还写过一篇文章,介绍二进制以及用它来解释古代中国伏羲图,以至于后来很多人认为他从《周易》中得到启发发明二进制。这种论调在民族自卑情节下流传广泛,这是往自己脸上贴金。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

(Gottfried Leibniz,1646.7.1-1716.11.14)

我们来看看进制之间怎么转换。二进制到十进制是很简单的,一个二进制数根据公式其数值等于k2n+K2n-1+…+k20,其中k只有0,1两个值,如11001,就等于124+123+022+021+120=25。
二进制转换成十进制的程序我就不演示了。
十进制转换到二进制就有一点麻烦了,用的一种除2余数法,我们操作一遍:
对十进制的25这个数,按照如下步骤操作:
先除2,得到商数12,余数为1;
然后用12再除2,得到商数6,余数为0;
然后用6再除2,得到商数3,余数为0;
然后用3再除2,得到商数1,余数为1;
然后用3再除2,得到商数0,余数为1;
到此计算完毕,把余数反过来写,即11001就是最后的结果。
我们用程序来表达上述过程:

number=int(input("Type number: "))
listt=""
while number >= 1:
    r1 = number%2   #余数
    number = number//2   #整除
    listt = str(r1) + listt   #倒过来拼串
print(listt)

不用说你就明白了,这个程序处理不了实数,因为实数有两部分,这个程序处理不了小数部分。小数部分不是通过除2取余,而是通过乘2取整得到的。
对十进制的0.125这个数,按照如下步骤操作变成二进制:
先把0.125乘2,得到0.25,取整数部分,是0;
再把0.25乘2,得到0.5,取整数部分,是0;
再把0.5乘2,得到1,取整数部分,就是1;
计算完毕,最后的结果就是0.001。
用程序实现一下:

number=float(input("Type number: "))
listt="0."
while int(number) != number:
    number = number*2
    r1 = int(number)
    listt = listt + str(r1)
    number = number - r1
print(listt)

测试0.125,得到结果0.001
测试0.124,得到结果0.00011111101111100111011011001000101101000011100101011。

初次接触,你可能会很惊奇,二进制表示0.124这么麻烦呐!可想而知有些小数会用到几百几千位才能够表示出来。许多人就会疑惑,那计算机里面究竟是怎么弄的呢?
我们知道计算机存储空间有限,不能无止尽地存这些数,所以对小数会按照固定的精度存储。由此我们可以看到对小数的表示,在计算机里面是不精确的,只是一个符合某种精度的大约值。
我们研究一下计算机内部数据的存储。我们知道计算机的最小数据单元是bit(比特),存一位,这个是不可再分割的。计算机里面所有数据和信息都是靠很多很多bit表示和存储的。或许你对bit没有什么概念,它能存多少信息呢?或者反过来说,一个数字一个字符一首音乐需要多少bit表示和存储呢?
我们简单计算一下。
对于整数,从0到无穷,一个bit只能表示两个数字,0/1。如果有四个数字要表示,我们需要两个bit,即00,01,10,11,以此类推,8个bit我们可以表示256个数字,16个bit可以表示65536个数字,32个bit大约可以表示40亿个数字。
存储都是需要靠物理设备元器件的,落实到物理上,存储设备在不同的地方不同的时代都不相同,只要能稳定地保持两种状态的器件都可以当成存储设备,最形象的想象就是开关。一个开关就是一个bit,存储65536个数字,我们需要6553616个开关,这是一个比较大的数,如果存储40亿个数字,我们需要3240亿个开关。
你肯定很吃惊,这么多开关合在在一起,得占多大的地方啊?你想象得没有错,早期的计算机确实占地很大,有一座房子那么大,程序员是钻进计算机里面编程序的。
早期的计算机还是电老虎,性能不高(相对于现在而言),经常坏(每15分钟烧掉一只真空电子管),IBM的老大Watson说这个世界上最多只需要5台计算机。
后来技术越来越进步,开关越做越小,也越来越快。
1947年,美国Bell Labs贝尔实验室的Bardeen巴丁、Brattain布拉顿、Shockley肖克莱三人发明了晶体管。这真的是一个好东西,尺寸小,开关速度快,发热量小,天生就是用来造计算机的。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=                                                                   watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

(晶体管照片)                                                (N型晶体管电路符号)

       晶体管有三极,e,c,b。高低电平变化,c和e就导通和截断。通过这个表示0和1。
       可以表示数(二进制),也可以表示运算,逻辑运算(因为0,1可以认为是两种状态是否),这样实现了逻辑学的基础:布尔代数(布尔代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非。由英国数学家George Boole开创)。
比如1-0,0-1就是逻辑非运算 NOT
比如下表是逻辑与运算 AND

01
0    0   0
1    0   1

比如下表是逻辑或运算 OR

0    1
0    0   1
1    1   1

比如下表是逻辑异或运算 XOR

0    1
0    0   1
1    1   0

有了二极管和晶体管,通过电路比较容易实现上面的逻辑,我们叫门电路(因为通过开关表示,门可以开可以关,所以起了这个名字)。
与门:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

分析:当输入1为高电平,输入2也为高电平时,Q11导通,Q9导通,则输出点也为高电平,即为1。
或门:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

分析:
当输入1或输入2为高电平时,Q6导通,输出点高电平,即数字量1。
非门:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

分析:
当输入为高电平时,Q1导通,输出点电压为Q1的c,e之间的压降,即0.3V,即输出为数字0;当输入为低电平时,Q1的c,e之间未导通,输出电压为上拉的电压,+5V,即数字量1。
现在我们用三极管做出逻辑运算来了,可以看出数据和运算在二进制中是一回事,所以最后在底层统一到门电路了。
门电路的符号:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我们先看怎么组合一下这些基本门电路让它存储状态,也就是逻辑上存一位bit。作为存储器,基本的要求是保持状态稳定,远古的时候用小石子和绳结,它们不会轻易变化,这个固有的物理特性就让它们适合存储,而手指则不合适,人老得去干别的事情,手指头的状态一下子就变化了。
我们用的如下双稳态电路当存储器:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上面我们组合两个或非门,一个的输出是另一个的输入,这样构成双稳态结构。当S端设为1的时候Q总是1,当R端设为1的时候Q总是0。
当电路上一秒还在“S=0,R=1”状态时(此时Q=0,非Q=1),突然变成了“S=0,R=0”,此时我们会惊奇的发现,由于Q=0,S=0,非Q仍然是1,非Q=1,R=0,Q仍然是0,双稳态电路这就做到了保持Q的状态。电路有了记忆。所以可以存储一位bit。
这个电路叫基本RS触发器。
把上面的RS触发器组合在一起,就可以存储多位了。如图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

现在我们终于有了能存储数字的器件了。从远古人类用手指用小石子用绳结作为存储器,经过了数千年上万年,我们发明了速度快得多体积小得多的存储器了。
真不容易啊。
要注意我们现在讲的是计算机内部的寄存器,我们平时还会接触硬盘一类的存储设备,它是怎么存的呢?它们的原理不同,是用的磁介质。不做进一步解释了。
手上有了这些器件,知道他们能从物理上表示和存储bit,后面我们不需要再管实际的物理部件了,只要从逻辑上去理解如何进行数据表示和存储。
先看正整数。计算机内部一般用定点法存储正整数,所谓定点,就是不管这个数时3还是30000,都用同样多的bit表示,如用16位bit表示整数。对3,表示为0000000000000011(前面补充14个0)。这样的好处时整数在计算机内部都是对齐的。定点法表示整数会有一个最大值,如16位最大能表示的数字为65535。
正整数是无符号的,那么怎么表示有符号的数呢?表示负数就必须有办法把这个符号表示出来。前面我们也提到过,在计算机里面一般用补码表示。规则简单地说就是取反加1。
这个规则另一种表述是:从最右边的位开始,逐个复制,遇到第一个1,复制这个1之后的操作变成逐个取反。我更加喜欢第二种表述,因为这是一种机械操作式的表述,让人好像眼前看到了计算机内部是如何变化的。
用补码表示数,最左边高位的符号,如果位1,表示为负数,0则为正数。
如:对-28,先看28的二进制00011100,求补码11100100,就是这么表示的。
如:对28,还是表示为00011100。
因为最高位是符号,所以补码表示的数字范围是无符号表示的一半,比如对8位表示,无符号表示范围从0到255,而用补码表示则为-128到127。
我们再看看怎么存储实数。
前面介绍过,实数在二进制表示种有精度问题,IEEE规定了几种格式,用得比较多的有两种:单精度和双精度。
这种结构是一种科学计数法,用S符号、E指数和M尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。
                S符号位     E指数    M尾数
单精度(32位)    1          8        23
双精度(64位)    1         11        52
一个实数,按照如下办法存储:
1,先确定符号位,0为正数,1为负数
2,数字转成二进制
3,规范化科学计数
4,计算E和M值
5,组合SEM
举例,5.75,我们这么办:
这是正数,所以S符号位为0。转成二进制,为101.11。把101.11规范化成1.0111*22。这样识别出指数为2,按照IEEE规定加127偏移量,得出129,这就是E,二进制表示为10000001。
尾数为0111(由于规范化之后小数点前永远为1,所以就不存储了),后面加19个0,补齐23位M为01110000000000000000000。拼在一起的到最后的存储格式:01000000101110000000000000000000。
除了数,我们还会接触到很多别的类型,如字符,音频,图像,那这些是怎么存储的呢?其实一切都要数字化。
对于字符,我们要规定字符的编码,比如对于a,我们规定编码为61。标准化组织制定了一些标准,让全世界的人统一编码,用于共享和交换。比如常用的ASCII。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

(ASCII码表)

音频是模拟信号,要全部记录下来需要无穷的空间存储,所以通过采样进行数字化,比如在一秒钟的音频种,我们采集100个点,记录下点上的值(16位记录一个点上的值),为了耳朵听不出来失真,要求采样足够密,按照MP3的标准,每秒要采样44100次。
我们可以计算一下,按照MP3规范,一秒的音频的位率是44100*16=640KB/s。
这下子我们能理解了为什么音频文件会比文本文件大很多。
图像也是类似的道理,我们可以逐点记录下图像的值。JPEG还有GIF都是这方面的标准。同样我们可以想象到,存储图像也需要很大的空间。
讨论到这里,我们可以看出来了,计算机内部把一切数字化,存储上就是存的数字。而运算也简化成了基本运算,加法,移位,逻辑运算。
这是一种还原论,这种哲学认为复杂的事物可以将其化解为各部分之组合来加以理解和描述。还原论历史悠久,第一个哲学家泰勒斯就说过名言“世界是由水做成的。”在科技史上,还原论影响巨大,但是它也不是万能的,比如解释生命和意识,还原论还不能让人信服。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

(Θαλῆς ὁ Μιλήσιος 泰勒斯,第一个哲学家,公元前624-公元前546)

 

标签:表示,存储,进制,二进制,number,bit,探秘,计算机
来源: https://blog.51cto.com/u_14602625/2963391