先来看一下整数的存储
比如int i = 1,看一下它的实际内存存放

那我们在来看一下浮点数的存储
浮点数不是像整数那样直接就可以以二进制的形式在内存存放的,他会按照一个标准解析之后,在存放到内存中
比如一个浮点数是19.625
它的二进制形式则是:10011.101
它的内存分布可不是如下分布的

一般我们会将这个浮点数先变成如下形式:

也就是按照指数的形式存放在内存之中
那么19.625变成上面这种形式就是
还是先看它的二进制:10011.101
那么小数点左移四位:1.0011101 * 2 ^4
这个就是存放在内存中形式,那么具体是怎么按位存的呢
先来看一下,单双精度浮点数的一个按位存储规则

大致意思就是
针对于这个数:1.0011101 * 2 ^4
符号位:0,因为是正数嘛
尾数位:0011101,小数点后面的位数嘛,那小数点前面这个1呢,直接舍弃就行,哈哈
这里说一下阶码:
阶码 = 阶数 + 偏移量
阶数 = 指数,这里指数就是4,二进制就是100
计算偏移量首先我们必须知道下面两个信息
1.单精度的阶码位数 8
2.双精度的阶码位数11
我们必须知道阶码位数,才能算偏移量,那么偏移量怎么计算?
2^e-1 - 1,这里e就是阶码的位数。
那么单精度的偏移量就是:2^7 - 1 = 128 -1 =127,双精度的偏移量就是:2^11 - 1= 1024 - 1 = 1023
综上所述:这里的阶码 = 4 + 127(这里我当成单精度浮点数) = 131 ,二进制就是:10000011
所以19.625的实际内存分布形式就是
OK,然后我们把它放到内存又是怎么存放的呢?
在考虑存放的时候,还是要注意低位存放在低字节,高位存放在高字节,还要注意,数据的存储顺序(低位从左往右存)与解析顺序(从右往左解析)

上代码,我们去看一下内存
- #include
- #include
-
- void main()
- {
- float num = 19.625f;
-
- printf("%p", &num);
-
- system("pause");
-
- return 0;
- }
去内存看一下

下面我说一下负浮点数的存储,还是拿19.625来说
定义一个数据类型float num = -19.625
直接上代码,然后看内存
- #include
- #include
-
- void main()
- {
- float num = -19.625f;
-
- printf("%p", &num);
-
- system("pause");
-
- return 0;
- }
内存:

这里怎么变成c1了?
我们还是来看一下内存分布图

换句话说,负浮点数就是把源码直接存放。
下面再来说一个问题,精度缺失问题,比如10.6,这个小数部分的0.6,我们要变成二进制就是
0.6 * 2 = 1.2
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6....开始循环1001
对于内存来说,是不允许这样一直循环下去的,所以 ,在相应有限的空间里面,只能存放一定的数据,后面的就直接丢失,所以,这也是小数为什么会造成一定的误差的原因