【问题标题】:Type Conversion in C going Bananas? [closed]C中的类型转换是香蕉? [关闭]
【发布时间】:2021-01-14 15:27:44
【问题描述】:

我和 C 似乎对这里的预期输出意见不一。

我有:

struct r_struct {
    int r_i;
    float r_f, r_f2;
};

struct r_struct r;

r.f = 100.0;

[...]
printf("f is A:%f B:%d, C:%d, D:%d\n", r.f, r.f, r.f_lhzr / 1, (int)r.f);

我得到这个输出:

f is A:100.000000 B:0, C:1079574528, D:0

我希望得到这个输出,因为浮点数应该以所有三种方式转换为整数:

f is A:100.000000 B:100, C:100, D:100

这里有人可以解释一下吗?

【问题讨论】:

  • 您期望的结果是什么?
  • relais.r_lhzr 是一个float 值,您使用它执行的所有计算都将产生浮点值。您不能使用 %d 格式说明符,因为它用于 int 值。格式说明符和参数类型不匹配会导致未定义的行为
  • 您只转换了printf 参数中的一个,其余的仍然是您尝试使用%d 打印的float 值.
  • 没有。它根本不知道如何“自动投射”。格式说明符只是字符串中的字符,对编译器没有任何意义。
  • 这不是它的工作原理。 printf 函数对传递给它的参数一无所知。它仅依赖于您在字符串中使用的格式说明符来解释这些参数占用的内存。编译器不会将任何类型的类型信息与参数一起传递。

标签: c casting printf


【解决方案1】:

来自printf() 的规范,例如https://en.cppreference.com/w/cpp/io/c/fprintf

如果默认转换后的任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式所需的参数,行为未定义

您有浮点值,并且只将一个转换为 int
您对浮点数使用 "%d" 说明符,这是任何可预测或可解释行为的结束,适用于所有输出和任何其他行为,而不仅仅是非强制转换值。

(sfefier 和 type 的对比是 cmets 中 SomeProgrammerDude 指出的。我这里参考 spec 加了 UB 方面。)

【讨论】:

    【解决方案2】:

    好吧,伙计们。

    现在明白了!非常感谢。

    我通过在打印前简单地将浮点数分配给 int 来解决我的问题。然后 printf 打印出正确的整数。

    int i;
    
    i=r.f; // or i=r.f/1; or i=(int)r.f;
    
    printf("Correct float casted to int: %d\n",i);
    
    /* Does NOT work by design. None of these:
    printf("Wrong float casted to int: %d\n",r.f);
    printf("Wrong float casted to int: %d\n",(int)r.f);
    printf("Wrong float casted to int: %d\n",r.f/1);
    */
    
    

    【讨论】:

    • (int)f 绝对有效,或者您可以给出浮点数并使用带有“精度”修饰符的浮点格式说明符,例如 "%.f"(注意点)
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2018-09-21
    • 2014-04-15
    • 1970-01-01
    • 2011-09-25
    • 2011-10-12
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多