负数
负数用补码来表示,补码等于数的反码 + 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