【问题标题】:Printing an integer as a Floaing point number [duplicate]将整数打印为浮点数[重复]
【发布时间】:2012-11-27 16:45:46
【问题描述】:

可能重复:
What is printf’s behaviour when printing an int as float?

int main()
{
 int x=4;
 int y=987634;
 printf("%f %f",x,y);
}

在编译此代码时,我得到的输出为 0.000000 0.000000。不应该将 x 和 y 类型提升为浮点数吗? O/P 不应该是 4.000000 和 987634.000000 吗? 谁能帮我这个。提前致谢。

【问题讨论】:

  • 我找不到确切的副本,但有人问过这类问题manytimesbefore
  • 我很高兴看到这种类型的任何东西。你可以发布链接。 @亚当罗森菲尔德
  • 但为什么总是零?结果不应该是设置位的整数等价物吗?

标签: c floating-point


【解决方案1】:

转换发生在具有包含特定参数的原型的函数的参数上。 printf()的原型不包含第一个之后的具体参数

int printf(const char *format, ...);

所以,除了“默认参数转换”(基本上任何等级低于intint 的整数类型和任何等级更低的浮点类型)之外,第一个参数之后不会自动转换比doubledouble谢谢你,Pascal Cuoq))。您需要自己使用强制转换操作显式转换它们

    printf("%f %f\n", (double)x, (double)y);

哦……你真的,真的,真的应该包含有问题原型的标题(在未定义行为的惩罚下)

#include <stdio.h>

【讨论】:

  • 只是关于“第一个参数自动转换后没有参数”的注释:省略号中的参数应用了提升。它们被称为“默认参数提升”,它们不包括从 intdouble 的提升 (C99 6.5.2.2:7)
【解决方案2】:

编译器不知道您的printf 格式字符串会将参数解释为浮点数。它以ints 的身份直接通过它们。

因为printf 是一个可变参数函数,所以传递有意义的参数真的取决于你。

【讨论】:

  • 如果它是一个不错的编译器,它会查看格式字符串,如果你问得好,它会发出警告。
【解决方案3】:

尝试printf("%i %i",x,y); 将整数打印为4 987634。有关printf 格式的详细信息,请参阅http://www.cplusplus.com/reference/cstdio/printf/

【讨论】:

  • 不是这个问题的真正答案
【解决方案4】:

ints 和 floats 在内存中的存储方式不同,但您的编译器不知道您需要浮点数。您需要明确地转换它们。

printf("%f %f",(float)x,(float)y);

【讨论】:

  • 由于可变参数是默认提升的,这样做是正确的,但它有点误导。你应该直接投到double
【解决方案5】:

可变参数函数(printf() 是其中之一)不进行类型检查,因为可变参数签名不包含任何类型信息。因此,没有隐式类型转换。您必须手动完成:

printf("%f %f", (double)x, (double)y);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多