我正在为 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 如何为 int 打印 0.000000 而为 float c 打印 1.000000?我已经看到它在 printf 中使用 %f 打印时将所有整数值打印为 0.000000。
另外,printf 是变参函数,它如何知道寄存器中传递的值是 int 还是 float?
最佳答案
我的灵力告诉我 Adam Liss 的评论是正确的答案:float
参数被提升为 double
,所以 printf()
函数期望发生这种情况:它期望堆栈上有一个 64 位值,但得到 32 位加上碰巧为零的垃圾数据。
如果提高显示精度,显示应该类似于 a = 0.00000000001
。
这也意味着这应该有效:
void main()
{
double c = 1.0;
long long a = 0x3FF0000000000000;
long long *ptr = (long long *)&c;
printf("\n0x%llX\n", *ptr);
printf("\na = %f", a);
printf("\nc = %f", c);
return;
}
关于c - 在 C 中将 int 打印为 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16607628/