Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

计算机硬件-数字的表示

负数

负数用补码来表示,补码等于数的反码 + 1

浮点数

两种表示小数的数据类型,分别是双精度浮点数和单精度浮点数

双精度浮点数类型用64位:符号位(1位) + 阶码(11位) + 尾数(52位)

单精度浮点数类型用32位:符号位(1位) + 阶码(8位) + 尾数(23位)

符号位:正数为0,负数为1;

指数位:阶数+偏移量,阶数是2^(e-1)-1,e为阶码的位数,也就是指数位的位数。偏移量是把小数点移动到整数位只有1时移动的位数,正数表示向左移,负数表示向右移;

小数位:即二进制小数点后面的数。

一个例子

把0.1(10)转成的二进制0.00011 0011 0011 …(2)转成浮点数形式的二进制:

(能够精确表示的小数为:0.5,0.25,0.125…等的自由组合)

转化过程见:https://cloud.tencent.com/developer/article/1856972

1、先要把小数点移动到整数位只有1,要向右移动4位,故偏移量为-4,通过指数位的计算公式2^(e-1)-1+偏移量 = 2^(11-1)-1-4 = 1019,把1019转成二进制为1111111011,不够11位要补零,最终得出指数位位01111111011;

2、移位后的小数位为.1 0011 0011 …,因为小数位只能保留52位,第50、51、52位、53位分别为0011,故对第52位进1使第51位为1,使第50、51、52位为010。

注意:此处的精度丢失问题,有很多小数(例如本例中的0.1)在转二进制时会出现无限循环的情况,所以在位数有限的境况下,肯定需要舍弃后面的精度。这一点,就与1/3这种小数是在十进制下无限循环类似。

定点数

只能表示纯小数,例如0.999991212

你的支持是我坚持的最大动力!