C语言中对于小数,采用float(单精度浮点型)和double(双精度浮点型)来存储。
Float
不管是float还是double,在存储中都分为三部分:
- 第一位s代表符号位,1代表负数,0代表正数。
- 第二个域是指数域e,对于单精度float类型,指数域有8位,可以表示0-255个指数值。指数值规定了小数点的位置,小数点的移动代表了所表示数值的大小。但是指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差值作为保存在指数域中的值,单精度数的偏差值为 -127,而双精度double类型的偏差值为 -1023。比如,单精度指数域中的值为130,则表示实际的指数值=130-127=3。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127 到 128 之间(包含两端)。实际的指数值-127(保存为 全 0)以及 +128(保存为全1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -126 和 +127 之间。
- 第三个域为尾数域M,其中单精度数为 23 位长,双精度数为 52 位长。
Float = s * 2e-127 * m
举个栗子:将小数9.9转化为浮点数
- 首先将
9.9
转换成24位二进制1001 . 1110 0110 0110 0110 0110
- =
1 . 0011 1100 1100 1100 1100 110
*2^3
, - 这里小数点前肯定是1,所以不需要存储。这样尾数域就是小数点的23位
- 指数值
e = 3 + 127 = 130 = 1000 0010
- 符号位 = 0
- 9.9 =
0 1000 0010 0011 1100 1100 1100 1100 110
0100 0001 0001 1110 0110 0110 0110 0110
0x411E6666
在线进制转换网站:https://lostphp.com/hexconvert/