使用%d打印浮点数

时间:2014-03-20 21:21:53

标签: c printf

我用printf

中的故意错误编写了这个程序
#include <stdio.h>

int main()
{
        double foo = 2.54f;
        printf("-> %d\n", foo);
}

运行几次之后输出:

- &GT; 1180400440

- &GT; 1754655672

- &GT; 1596232744

- &GT; -905631720

- &GT; 202675976

- &GT; -1580281720

- &GT; 1020283160

- &GT; 929827960

我的问题是,为什么每次运行程序时都会输出不同的数字?

2 个答案:

答案 0 :(得分:5)

因为在您的平台上,doubleint以不同方式传递给函数。通常,double在浮点寄存器中传递,而int在通用寄存器中传递。 (当然,达到某种限制;最终你会用完寄存器,如果参数太多,剩下的就会在堆栈上传递。)

当您告诉printf期待int时,它会查找int预计会找到int的位置。但是GPR没有被设置为任何特定值,因为当你调用printf时,你用double调用它,它被放入浮点寄存器。

你真的不需要知道,虽然它可能很有趣。实际上未定义的行为(UB)是关于您提供的参数类型的printf,并且大多数编译器会警告您(至少如果您提供-Wall命令 - 行选项或等价物)。 UB意味着可能发生任何事情,包括例如程序提前终止或使用完全随机数据。因此,请确保您要求编译器向您发出警告,并确保修复它们。

答案 1 :(得分:1)

该错误使您的程序调用未定义的行为。

请参阅此C缺陷报告问题:

http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html

未定义的行为意味着一切都会发生。