一、C++浮点数
C++中的浮点型,也被称为整型,通常包括两种:
类型 | 关键字 | 大小 |
单精度浮点型 | float | 4字节 |
双精度浮点型 | double | 8字节 |
二、存储格式
2.1 单精度类型的存储格式
float类型的大小为4字节,32位,从高位到低位的存储方式如下:
符号位 | 阶码 | 尾数 | |
位编号 | 31 | 30-23 | 22-0 |
大小(bit) | 1 | 8 | 23 |
2.2 双精度类型的存储格式
double类型的大小为8字节,64位,从高位到低位的存储方式如下:
符号位 | 阶码 | 尾数 | |
位编号 | 63 | 62-52 | 51-0 |
大小(bit) | 1 | 11 | 52 |
三、十进制浮点数的存储方式
首先假设一个浮点数是通过float类型的变量进行存储的,分为符号位、阶码与尾数三部分。
步骤1 | 首先确定上述存储格式的符号位,负数为1,正数为0 |
步骤2 | 将小数的绝对值,按照小数点左边和右边分别转换成二进制形式 |
步骤3 | 将小数点向左移动,直到小数点左边只剩一个1 保证数值不变的情况下,我们的指数将从0开始变化 类似于科学计数法,必须101.011变成1.01011 * 2^2,此时指数从0就变成了2 |
步骤4 | 此时,指数的存储方式为:当前指数的数值+127,再转换成二进制 比如上述例子中,2+127 = 129,指数存储为129的8位二进制:1000 0001 |
步骤5 | 尾数部分,因为小数点左边都是1,所以我们仅记录小数点右边的部分。 比如上述例子中,1.01011的尾数部分是01011,后边全补0到23位。 因此尾数部分是010 1100 0000 0000 0000 0000 |
如果是double类型,存储规则都是相同的。double类型的指数偏移量为1023,float的偏移量为127。
四、小例子
举例:float x = -12.625;
首先,符号位为1 |
再将其绝对值化为二进制:1100.101 (12.625 = 8 + 4 + 0.5 + 0.125) |
移动小数点1100.101 -> 1.100101,指数 = 3 + 127 = 130 |
至此,符号位1,指数1000 0010,尾数100 1010 0000 0000 0000 0000 |
拼接得,浮点数存储为:1100 0001 0100 1010 0000 0000 0000 0000 |