浅析C++中浮点数在内存中的存储方式

发布时间 2023-11-03 21:14:43作者: 少玩手机

1. 任何数据在内存中都是以二进制的形式进行存储。

  1. 例如,short型数据1156,由于在32位机和64位机都占2B 一共16位 其二进制形式为:00000100 10000100。

  2. 在Intel CPU架构的系统中(目前用的最多的硬件架构系统),存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。

  3. 目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。

  4. 计算机将带有小数地数值分为两个部分进行存储。一部分表示值,另一部分表示用于对值进行放大或者缩小。比如表示34.1254那么用科学计数法表示为0.341254E100 100就是那个缩放因子。

6. C++表示浮点数的方式与上述相同,只不过C++是基于二进制进行表达,因此缩放因子是2的幂而不是10的幂

  1. 在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(指数部分)(N)+尾数(M)。对于float型数据,若其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
    float 与double

            31        30-23       22-0
    
            符号位     阶码        尾数
    
            63        62-52       51-0
    
            符号位     阶码        尾数
    

符号位:0表示正,1表示负

无论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign) : 0代表正,1代表为负
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分(Mantissa):尾数部分
单精度存储示意图:
image
双精度存储示意图:
image