在C中从int转换为float会更改值

时间:2009-10-27 02:29:09

标签: c casting

您好我正在尝试从C中的int转换为float,由于某种原因,演员会更改值,我不知道为什么。所以:

fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);

产生两个不同的数字。请注意,rgbValues->greenint

知道为什么会这样吗?

由于

3 个答案:

答案 0 :(得分:10)

你必须在你的格式字符串中说。使用:

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
                     ^

而不是:

fprintf(stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
                     ^

请注意,从df的更改(限制^不是代码的一部分,只是指示查看的位置)。

答案 1 :(得分:6)

%d格式说明符对printf说,“从堆栈中取出接下来的4个字节,将它们解释为整数,并打印出该整数。”由于您实际上是将float作为参数传递,因此float(以IEEE-754格式存储)的字节被误解为整数,因此值不同。 (实际上,float由于可变参数函数中的参数提升而被转换为double,并且它被提升为double的前4个字节被解释为整数。)

正确的解决方案是在打印%e时使用%f%g%d格式说明符之一而不是float%e说,“从堆栈中取出接下来的8个字节,将它们解释为double,并使用科学(指数)表示法打印出来”%f使用定点打印出来格式,并%g打印出%e%f中的较短者。

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);

答案 2 :(得分:0)

扩展@ AraK's回答,您将一次转换为float,然后printf将该位模式解释为格式说明符字符串中的int。它正在完全你正在告诉它做什么:)

如果您只想 强制转换为float - 请执行以下操作:

// format specifier is %d for int, %f for float
// show the cast value of rgbValues->green as well as its "real" value
fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green); 

修改 - 基于评论的措辞