共计 2962 个字符,预计需要花费 8 分钟才能阅读完成。
计算机如何存储和表示数字:二进制。
二进制
存储单位 MB, GB, TB 等。
正数,负数,整数,浮点数的表示。
美国信息交换标准代码 – ASCII, 用来表示字符。
UNICODE 1992 年诞生,是字符编码标准,解决 ASCII 不够表达所有语言的问题。
二进制中,一个 1 或 0 叫 一位(a bit).8 位能表示的最小数字是 0,8 位都是 0;最大数是 255,8 位都是 1. 能表示 256 个不同的值,2 的 8 次方.
8 位是如此常见,以至于有专门的名字:字节.
1 字节 = 8 位(1 bytes = 8 bits)
MB(Mege 是百万字节), GB(Giga 是十亿字节), TB(8 万亿个 1 和 0)等,不同前缀代表不同数量级。
1 千字节 = 2 的 10 次方 = 1024 字节 1000 也是千字节 (KB) 的正确单位,也就是 1000 和 1024 都是正确单位。
32 位 /64 位计算机:是一块块处理数据,每块是 32 位或 64 位。
32 位能表示的最大数是:43 亿左右。(32 个 1)。
现在图片都是用 32 位颜色。
正数,负数,整数,浮点数的表示
负数,大部分计算机用第一位表示正负:1 是负,0 是正。用剩下的 31 位来表示数字。能表示的数字范围是:正 20 亿 到 负 20 亿
64 位能表示最大数是正负 9.2 * 10 ^ 18
计算机必须给内存中每一个位置,做一个“标记”,这个标记叫“位址(ADDRESSES)”,目的是为了方便存取数据。
非整数,常见浮点数。有很多种表示,最常见的是 IEEE 754 标准。它用类似科学记数法的方法,来存取十进制值。例如:625.9 = 0.6259 * 10 ^ 3, .6259 叫“有效位数”,3 是“指数”。
在 32 位浮点数中,第 1 位表示数字的正负,接下里 8 位存指数,剩下 32 位存有效位数。
ASCII
与其用特殊方式来表示字母,计算机可以用数字表示字母,最直接的方法是给字母编号。
设计于 1963 年,ASCII 是 7 位代码,足够存储 128 个不同值。可以表示大写字母,小写字母,数字 0 -9,特殊符号以及标点符号。
Unicode
解决 ASCII 不够表达所有语言的问题。
最常见的 Unicode 是 16 位,有超过一百万个位置。
对所有语言的每个字符都够了
100 多种字母表加起来占了 12 万个位置,还有位置放数学符号,甚至 Emoji,就像 ASCII 用二进制来表示字母一样。
其它格式,比如 MP3 或 GIF,用二进制编码声音 / 颜色,表示照片,电影,音乐。
这些标准归根到底是一长串位。
短信,视频,互联网上的每个网页,甚至操作系统,只不过是一长串 1 和 0。
算术逻辑单元
ALU,英特尔 74181
ALU 有 2 个单元,1 个算术单元和 1 个逻辑单元
算术单元:半加器(处理 1 个 bit,2 个输入)。全加器(处理 1 个 bit,3 个输入)。8 bit 加法(1 个半加器,7 个全加器)
逻辑单元:检测数字是否为 0 的电路(一堆 OR 门最后加一个 NOT 门),ALU 抽象成 V 符号,Flag 标志(是否相等,是否小于,是否溢出等等)
表示和存储数字是计算机的重要功能,但真正的目标是计算,有意义的处理数字。
处理数字的操作由计算机的“算术逻辑单元(ARITHMETIC & LOGIC UNIT)”处理,称之为: ALU
是计算机的数学大脑
计算机里负责运算的组件,基本其它所有部件都用到了 ALU
英特尔 74181:
第一个封装在单个芯片内的完整 ALU。布尔逻辑,做一个简单的 ALU 电路功能和 74181 差不多。
ALU 单元
ALU 有 2 个单元,1 个算术单元和 1 个逻辑单元。
算术单元:负责计算机里所有的数字操作,比如加减法,比如某个数字 +1(增量运算)。计算根本“把两个数字相加”,可以用单个晶体管一个个拼,把这个电路做出来,但很快就会复杂到难以理解。所以会使用更高层的抽象,用逻辑门来做。
最简单的加法电路,是拿 2 个 bit 加在一起(bit 是 0 或 1),有 2 个输入:A 和 B,1 个输出:就是两个数字的和。需要注意的是:A,B,输出,这 3 个都是单个 Bit(0 或 1),输入只有四种可能。
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
二进制里,1 与 true 相同,0 与 false 相同。这组输入和输出,和 XOR 门的逻辑完全一样。
1 + 1 = 10
使用 XOR 门不够表示,需要一根额外的线代表“进位”。只有输入是 1 和 1 时,进位才是“true”,因为算出来的结果用 1 个 bit 存不下,可以和 AND 门一齐使用,构成半加器
半加器 / 全加器
两个输入 A 和 B 都是 1 位,两个输出“总和”与“进位”。
如果想处理超过 1 + 1 的运算,需要“全加器”。
101
101
—-
1010
意味着,算下一列的时候,还有之后的每一列,得加 3 位在一起,并不是 2 个。
半加器:输出了进位。
有 3 个输入:A,B,C(都是 1 个 bit)所以,最大的可能是:1 + 1 + 1
“总和”1,“进位”1,所以要二条输出线:“总和”和“进位”。
可以用 半加器 做 全加器:先用半加器将 A 和 B 相加,然后把 C 输入到第二个半加器,最后用一个 OR 门检查进位是不是 true。
可以再提升一层抽象,把全加器作为独立的组件。全加器会把 A,B,C 三个输入加起来,输出“总和”和“进位”。
独立组件:
使用独立组件,可以相加两个 8 位数字。
如果第 9 为有进位,代表着 2 个数字的和太大了,超过了 8 位,叫做“溢出”。一般来说“溢出”的意思是,两个数字的和太大了,超过了用来表示的位数,这会导致错误和不可预期的结果。著名的例子是:吃豆人,用 8 位存当前关卡数。如果玩到了第 256 关,ALU 会溢出,造成一连串错误和乱码,使得该关卡无法进行。
避免溢出,可以加更多的全加器,可以操作 16 或 32 位数字。让溢出更难发生,但代价是更多逻辑门,另外一个缺点,每次进位都要一点时间。如今的量级是每秒几十亿次运算,所以会造成影响。所以,现代计算器用的加法电路有点不同,叫“超前进位加法器”。它更快,做的事情是一样的:把二进制数相加。
ALU 的算术单元,也能做一些其它数学运算,一般支持这 8 个操作:
ADD 加法
ADD WITH CARRY 带进位的加法
SUBTRACT 减法
NEGATE
INCREMENT 增量(+1)
DECREMENT 减量(-1)
SUBTRACT WIH BORROW 带借位的减法
PASS TUROUGU 数字无改变通过
就像加法器一样,这些操作也是由逻辑门构成。
没什么魔法,只是更多逻辑门。
逻辑单元(LOGIC UNIT)
逻辑单元执行逻辑操作,AND, OR, NOT 操作。也能做简单的数值测试。比如一个数字是不是负数。
检查 ALU 输出是否为 0 的电路:使用一堆 OR 门检查其中一位是否为 1,哪怕只有一个 Bit(位)是 1,就知道那个数字肯定不是 0,然后用一个 NOT 门取反。所以只有输入的数字是 0,输出才为 1。
只是一大堆逻辑门巧妙的连接在一起。
特殊符号来表示 ALU:
8 位 ALU 有两个输入,A 和 B,都是 8 位(bits),还需要告诉 ALU 执行什么操作,例如加法或减法,所以用 4 位的操作代码告知 ALU,简言之,”1000″ 可能代表加法命令,”1100″ 代表减法命令。操作代码告诉 ALU 执行什么操作,输出结果是 8 位的,ALU 还会输出一堆标志(FLAG),“标志”是 1 位的,代表特定状态。比如相减两个数字,结果为 0。
ALU 常用标志:
OVERFLOW(BIT) 是否溢出
ZERO(BIT) 是否相等
NEGATIVE(BIT) 是否负数
计算机是怎样在没有齿轮或杠杆的情况下进行运算?
晶体管
二进制
逻辑门
ALU(算术单元和逻辑单元)
计算机需要一些“记忆”。