我正在为Little Endian使用Visual Studio TC编译器.
以下是这段代码:
以下是这段代码:
void main()
{
float c = 1.0;
int a = 0x3F800000;
int *ptr = (int *)&c;
printf("\n0x%X\n",*ptr);
printf("\na = %f",a);
printf("\nc = %f",c);
return;
}
输出是:
0x3F800000 a = 0.000000 c = 1.000000
浮点值1.0为0x3F800000,并在内存中存储为00 00 80 3F,适用于Little Endian.
将相同的值分配给int a. printf如何打印0.000000一段时间1.000000 for float c?我已经看到它在printf中使用%f打印时将所有整数值打印为0.000000.
另外,由于printf是可变参数函数,它如何知道寄存器中传递的值是int还是float?
解决方法
我的通灵能力告诉我,Adam Liss的评论是正确答案:浮动参数被提升为double,因此printf()函数期望发生这种情况:它期望堆栈上的64位值,但是获得32位加垃圾数据碰巧是零.
如果增加显示精度,则显示应类似于= 0.00000000001.
这也意味着这应该工作:
void main()
{
double c = 1.0;
long long a = 0x3FF0000000000000;
long long *ptr = (long long *)&c;
printf("\n0x%llX\n",c);
return;
}