【C语言】浮点型数据存储 和 整型数据存储的区别
现在计算机中的浮点数存储都是遵循IEEE754/854标准,以二进制的科学计数法存放到内存中。二进制浮点数是以符号数值表示法的格式存储——最高有效位被指定为符号位(sign bit);“指数部分”,即次高有效的e个比特,存储指数部分;最后剩下的f个低有效位的比特,存储“有效数”(significand)的小数部分(在非规约形式下整数部分默认为0,其他情况下一律默认为1)。
对于浮点数在计算机中有两种存储的精度,即单精度和双精度,单精度是32位,双精度是64位。
float 的内存分布 符号位(1bit)指数部分(8bits) 尾数部分(23bits)
double 的内存分布 符号位(1bit)指数部分(11bits)尾数部分(52bits)
- S 符号位:0表示正数;1表示负数
- E 指数:即阶码,指明了小数点在数据中的位置
- M 尾数:小数点后面的存储部分
- 为了让指数表示正、负引入了偏差码,float的为127,double的为1024
浮点数在计算机中的存储:
定义变量 float a;
十进制小数 a=10.5
大小: 4个字节 ---> 32位bit位
10.5 ---->转化为二进制指数格式
10 :-->十进制 转 二进制:1010
0.5:-->小数 十进制 转 二进制:0.1
组合转成二进制小数形式: 1010.1 ---> 把二进制小数转成科学计数法的形式(指数形式): 1.0101 * 2^3
S 符号:0
E 指数:3 127+3=130 ---> 二进制为:10000010
M 尾数:0101 ---> 01010000000000000000000
所以,小数10.5在内存中的存储形式:0 10000010 01010000000000000000000
存储:
符号位: 0
指数位:1000 0010 --->指数3(引入偏差码)
小数位:0101 补 19个0
反之,将浮点数机器码转为小数形式:
例如:随机数 0 1000 0011 11101100000000000000000
S 符号:0
E 指数:1000 0011 --->131 ---> 131-127=4
M 尾数:11101100000000000000000
二进制小数形式:1.111011 * 2^4 ---> 11110.11
整数部分11110 ---> (0001 1110)---> 转换后结果为:30;
小数部分0.11 权位相加↓
0.5+0.25=0.75
索引
4 3 2 1 0 -1 -2
1 1 1 1 0. 1 1
1*2^4 + 1*2^3 +1*2^2^2 + 1*2^1 + 1*2^-1 + 1*2^-2(权位相加)
16 8 4 2 0.5 0.25
最终结果:
30.75
double a;
初始化/赋值和float一样
大小: 8个字节 --- 64位长度
存储结构:64位
运算逻辑和float一样,因为64位太长,这里就不做演示了。
一定要很清楚数据在计算机的存储方式,知道数据布局可以帮助优化内存访问,提高程序运行效率;理解数据存储有助于识别和解决内存相关错误,如缓冲区溢出。确保数据类型和大小正确,避免精度损失或数据截断;不同平台的数据表示可能不同,了解存储方式可确保程序的可移植性等。
总之,了解数据存储方式是编写高效、安全、可靠代码的基础。
以上。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!