int类型定义,float、double类型引用造成的结果

测试程序:


//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;
}


在main.c中定义的int类型x,y, t,k在int3double.c中用double,float类型引用会使xytk的值变成什么?
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存储的。



你可能感兴趣的:(c语言)