seegongsik
结构

怎么工作 计算机 怎么存负数和小数

到目前为止,我们存的只是0、1、2这样的正整数。那零下5度、负的余额、3.14这样的数,又怎么用0和1来存呢?这里有两个巧妙的办法。

01

把最前面的开关当作符号

存负数的第一个想法很简单。
拿出一个开关,专门用来表示符号。
最前面一位是0就表示正数,是1就表示负数,其余的开关用来表示大小。

符号
0
64
0
32
0
16
0
8
0
4
1
2
0
1
1
读作+5

最前面一格是符号,其余几格表示大小。

只改最前面一格,+5就变成了-5。
简单是简单,但有不方便的地方。
每次计算都得单独照顾符号,而且还会出现两个0。
也就是+0和-0。

02

绕一圈来表示负数

所以计算机实际用的办法更巧妙一些。
想想汽车的里程表就明白了。
从9999再走1,就会回到0000。
反过来,从0减1,就会绕回到最后一个数。
利用这一点,人们把最后面的那些数拿来表示负数。

0
0000 0000
-1280+127

同样的位,绕过一圈的部分就读成负数。

这种方法叫作补码(二进制补码)。
好处是加负数时也只要照常相加,加法电路自己就能得出正确答案。
不用另做减法电路,所以计算机选了这种方法。

03

小数点是浮动的

接下来是3.14这样的小数。
秘密就藏在名字里:小数点不是固定在一个位置,而是浮动的。
同样的数字,小数点点在哪里,就能表示大数或小数。
下面可以在314这几个数字之间移动小数点。

3.14
现在的值是 3.14

移动小数点,同样的数字就变成不同的值。

小数点往左移,数就变小;往右移,数就变大。
正因为小数点能这样浮动,从很大的数到很小的数都能用同一种方式存下来。
所以叫作浮点数,也就是浮动的小数点。

04

拆成符号、小数点位置和数字

那么浮点数怎么用0和1来存呢?
把开关分成三个区。
最前面是刚才讲的符号,中间是小数点的位置(数有多大),剩下的是实际的数字。

符号
小数点位置
实际的数
符号 · 是正还是负(1格)
小数点位置 · 小数点浮在哪里(几格)
实际的数 · 内核(剩下的)

把开关分成三个区来存。

有了这三块,不管小数点在哪里,任何数都能写成0和1。
这和科学课上用的科学记数法是同一个思路。
就像把3.14拆成0.314乘10一样。

05

计算机有时存不准0.1

最后讲一个有趣的事实。
让计算机算0.1加0.2,有时得不到正好的0.3。
会差那么一点点,因为0.1没法用0和1不多不少地存下来。

0.1 + 0.2 = 0.30000000000000004

在我们眼里是0.3,计算机里却留着很小的误差。

用十进制写1除以3,会得到0.3333...这样没完没了的数。
在0和1的世界里,0.1也是这样没完没了的数。
所以只能在某处截断,很小的误差就是从那里来的。
这不是计算机算错了,而是用0和1存小数这种方式本身的局限。

一句话总结负数靠符号开关和绕一圈的办法来存,小数靠浮动的小数点来存。负号也好,3.14也好,说到底都是多加了一条约定的0和1。
← 结构
如果有帮助,请支持我们