c - 在 C 中将 int 打印为 float

标签 c printf

我正在为 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/

相关文章:

c++ - 选择4个随机数printf

Java:使用 Printf 对齐代码?

c++ - 如何用单向链表实现一个队列,使其 ENQUEUE 和 DEQUEUE 的时间复杂度为 O(1)?

c - while (scanf()==1) 不起作用 - 我的错误是什么?

c++ - tm 结构中 tm_sec 字段中 61 的用途是什么

c - 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

c - printf 定义为 void

c - C中的输入输出

c - 在 64 位平台上取消引用整数指针

C 编程 : Forward variable argument list