测试程序:
//main.c
int x = 0x1234;
int y = 0x2345;
int t = 0x3456;
int k = 0x4567;
void int2double();
int main(){
int2double();
printf("x:0x%x, y:0x%x, t:0x%x,k:0x%k\n", x, y , t, k);
return 0;
}
//int2double.c
double x;
float t;
void int2double(){
x = -0.0;
x = -8.25; //8.25 = 1000.01b
x = -0.25; //0.25 = 0.01b;
t = 0.0;
t = 8.25;
t = 0.25;
}
8.25用二进制数表示为:1000.01,用科学计数法表示为: 1.00001 * 2^3。
所以根据IEEE标准,float类型-8.25在内存中的存储为:
符号位-----指数(8位)-----尾数
1-----------127+3--------00001 ==0xc104 0000
根据IEEE标准,浮点数的指数部分要加上基127,尾数部分只取科学计数法的小数部分即可。
所以根据IEEE标准,double类型-8.25在内存中的存储为:
符号位------指数(11位)------尾数
1-----------1023+3----------00001 == 0xc020 8000 0000 0000
根据IEEE标准,浮点数的指数部分要加上基1023,尾数部分只取科学计数法的小数部分即可。
0.25用二进制数表示为:0.01,用科学计数法表示为: 1.0 * 2^(-2)。
所以根据IEEE标准,float类型-0.25在内存中的存储为:
符号位--------指数(8位)-----------尾数
1-------------127-2----------------0 == 0xbe80 0000;
double类型-0.25在内存中的存储为:
符号位--------指数(11位)----------尾数
1-------------1023-2---------------0 == 0xbfd0 0000 0000 0000;
那么问题就来了,float类型的0.0在内存中怎么存储?
难道是下面这样吗?
符号位------指数-------- 尾数
0----------127+0---------0 == 0x7f80 0000
其实不是的,0.0在内存中的存储就是0;
计算机不会按照float类型去存储0.0,而是按照整数类型的0存储的。