文章目录
1,float,double的内存
调试代码:
#include<stdio.h>
int main() {
float a = 5.0f;
double b = 5.0;
return 0;
}
调试结果:
float:
double:
2,二进制小数
0.1代表2的-1次方,也就是0.5
0.01代表0.25
依次类推。0.11代表0.75
有些数值无法准确的表示,因为2的次方组合起来不能完全等于。
3,IEEE754标准
表示:二进制的科学计数法
符号位S:0正1负。
有效数字M:从左往右所有数字,从非0值开始。
位数E:小数点与第一个数字的距离。
举例:9.0,1001点0000。
S:0
M:1.001
E:3
存储:32位浮点数
1个S,8个E,剩下的23个M。
存储:64位浮点数
1个S,11个E,剩下的52个M。
SME
S:1位,0或1。
原封不动。
M:8或11位。
因为总是以1开头,故去掉,拿出来的时候补上。
E:无符号,23或52位。
为了表示有符号的数,要加上127或者1023。
4,float的5.0
101.0
S:0
M:101,去掉1变成:01,后面全部补0
E:2,加127变成129,也就是1000 0001
0
1000 0001
0100 0000 0000 0000 0000 000
=》
0100 0000 1010 0000 0000 0000 0000 0000
进制转换:https://www.osgeo.cn/app/s1653
2变16:
40 a0 00 00,和案例完全一致。
5,double的5.0
101.0
S:0
M:101,去掉1变成:01,后面全部补0
E:2,加1023变成1025,也就是10000000001
0
10000000001
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
=》
0100 0000 0001 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
2变16:
40 14 00 00
00 00 00 00
和案例完全一致。