浮点数在内存中的存储
浮点数存储方式
浮点数在内存中的存储方式遵循IEEE 754标准,通常分为32位和64位两种。
存储格式为V = (-1)^s * M * 2^E,
其中s是符号位,M表示有效数字,E表示指数[2]。对于32位浮点数,其存储结构为:
最高位为符号位,接着8位为指数位,剩余的23位为有效数字。实际可保存的有效数字位为24位[10]。
对于64位浮点数,最高位也是符号位,接着11位为指数位,剩余的52位为有效数字,实际可保存的有效数字位为53位[10]。
在存储时,有效数字M的小数部分可以节省1位,读取时再补上[5][10]。
指数E为无符号整数,对于8位E,其取值范围为0-255;对于11位E,其取值范围为0-2047[10]。
实际存储时,E的真实值需加上一个中间值。32位浮点数的E中间值为127,64位浮点数的E中间值为1023[10]。
浮点数在内存中的取过程分为三种情况:
1. E不全为0或1,此时浮点数表示需按照指数E的计算值减去127(或1023),再加上有效数字M。
2. E全为0,表示真实值,有效数字M不再加1。
3. E全为1,表示±无穷大[10]。
需要注意的是,不同的编译器或硬件平台可能采用不同的字节序,即“大端字节序”或“小端字节序”。大端字节序存储是将高位数据存储在低地址处,低位数据存储在高地址处;小端字节序存储则是将高位数据存储在高地址处,低位数据存储在低地址处[5][9]。
———————————————————————————————————————————
浮点数代码对比和整数的区别
这里首先上一个代码 进行和整数的对比
主要负责说明浮点数和整数在内存里面的存储方式是不一样的
从这个代码的转换里面 我们可以了解到
整数和浮点数在内存里面的存储方式是不一样 的
n是整数,放进去 拿出来的数值是不一样的
举个我之前老师讲的例子来说 在西风国家亲个嘴没啥 但是在中国古代没结婚 亲个嘴不得了了
———————————————————————————————————————————
浮点数的储存规则
首先 我们可以看到 浮点数的存储的规则是有公式的 我们根据公式,套图片很容易理解
——————————————————————————————————————————
小数点如何换算成二进制
小数点向左移动两位 所以是2次方
下面的2 是几进制
这个小数点换算成而二进制可以理解为
1 可以理解为
2 也可以理解为
小数点后面的数字换算成二进制,实际上就是将这个小数转换成二进制分数。以0.625为例,我们将其转换成分数,即625/1000。接下来,我们将这个分数转换成二进制。
首先,我们将分子625和分母1000同时除以2,得到312.5和500。我们将312.5作为新的分子,500作为新的分母,重复除以2的过程。
```
625 ÷ 1000 = 0.625
312.5 ÷ 500 = 0.625
```
由于312.5除以500的结果仍然是0.625,我们可以知道,这个分数可以一直除以2下去,而且商永远都是0.625。因此,0.625的二进制表示就是0.101。
其他小数点后的数字换算成二进制的方式也是类似的,关键在于将小数转换成分数,然后不断地将分子和分母除以2,直到分子不再改变为止。
——————————————————————————————————————————
浮点数公式的计算讲解![](https://img-blog.csdnimg.cn/direct/902863adf8ac41689f2f2323ebc364c7.png)
关于E
小数点向左移动两位 所以是2次方
但是放在内存里面需要+127 下面我们会详细解释 不要着急
关于S
s可以为1或者0 因为这里是判断正负值
如果是正数 那么s数值就是0
如果是负数 那么s的数值就是-1
关于M
1.011是M
这个数值是怎么来的
可以这样理解 经过计算,计算出5.5的二进制是101.1
101.1->可以计算成1.011*10平方
但是这里是二进制的计算 所以是
101.1->1.01*10^2
由此得出,M的数值是1.011
同时得出s的数值是2 也就是2次方
图解
——————————————————————————————————————————
浮点数内存的划分使用
我们可以看见 在计算机的存储里面
上面的是32位环境,内存划分的使用
下面的是64位环境,内存划分的使用
清晰的标注出SEM在内存的划分方式
——————————————————————————————————————————
浮点数存储的过程
浮点数在计算机中的存储是通过遵循一定的标准和规范来实现的,其中最常见的是IEEE 754标准。
下面是浮点数在计算机中存储的一般过程:
1. **标准化表示**:为了能够在计算机中统一存储和处理浮点数,首先要对浮点数的表示方法进行标准化。这包括确定数的表示范围和精度。在IEEE 754标准中,浮点数被分为单精度(32位)和双精度(64位)两种,还有其他较少用的类型。
2. **表示格式**:浮点数通常分为三部分:符号位、指数和尾数。
- **符号位**:表示数的正负,通常是一个单独的位。
- **指数**:表示数的规模或大小,通常采用偏移量(如+127)的编码方式,以允许表示正负指数。
- **尾数**:表示数的实际精度,是浮点数的主要部分,通常是一个二进制小数。
3. **二进制表示**:将浮点数的实际值转换为二进制形式。这包括将数的整数部分和小数部分分别转换为二进制,并合并成一个连续的二进制数。
4. **规格化**:为了便于存储和处理,浮点数通常要进行规格化处理。规格化的目的是将尾数的最高位设置为1,这样可以简化浮点数的运算算法,并确保所有的浮点数都在一个固定范围内。
5. **编码**:将规格化后的二进制数按照浮点数的表示格式进行编码,形成最终的存储形式。在IEEE 754标准中,这个过程还包括将符号位、指数和尾数的二进制编码插入到固定位置。
6. **存储**:最后,将编码后的浮点数按照计算机的字长(如32位或64位)存储在内存中。
在计算机内部进行浮点运算时,首先要对存储的浮点数进行解码,然后进行相应的数学运算,最后将结果重新规格化并编码存储。
这个过程体现了计算机在处理浮点数时的高效性和统一性,使得不同计算机系统和编程语言能够在浮点数的表示和处理上实现兼容和通用。
5.5的二进制 101.1
这里得到指数E之后 需要知道 指数的计算放到内存里面
需要+127 拿出来的时候需要-127
——————————————————————————————————————————
这里拿一个代码进行举例(计算的详细解剖)重点
这里我们找的是32位的环境
计算机的划分是1bit位(S)+8bit位(E)+23bit位(M)
这里是拿5.5在计算机里面的存储来进行举例
1. 首先判断出这个是正数所以是0->S,得出0的二进制是0
2. 5.5换算成二进制也就是101.1—>M
3. E也就是次方倍数,M变成1.011,得出1.011*2^2所以得出2—>E,1.011->M
这个时候我们得出M的二进制也就是011,为什么是011,因为计算机计算原理里面规定可以省略,因为我们已知指数幂,已知正负数,1.011我们可以把前面的省去,计算机根据指数幂可以推算出次方是正数还是负数,得出SME ,所以计算的时候自动把小数点前的省去。方便存储和计算。
4. 根据换算我们可以知道 指数是需要加127的 因为小数的二进制是可能是负数的也就是,如果 是0.123等等,这都是负数的,所以需要+127,所以得出E的存储的数值是2+127=129
得出129的二进制是10000001
5. 也就是最后一步,也就是根据内存的划分和使用
也就是
0(S) 10000001(E) 011(M)
但是计算机的计算里面,计算的时候是需要满足32位的所以需要补满32位,所以我们补满0 就可以了
0 10000001 01100000000000000000000
——————————————————————————————————————————
举例的二次解析
所以此时我们也就清除了 为什么在代码里面进行整数和浮点数的换算得到的结果是不一样的
因为换算的逻辑是不一样的