您好我正在尝试从C中的int
转换为float
,由于某种原因,演员会更改值,我不知道为什么。所以:
fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
产生两个不同的数字。请注意,rgbValues->green
是int
。
知道为什么会这样吗?
由于
答案 0 :(得分:10)
你必须在你的格式字符串中说。使用:
fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
^
而不是:
fprintf(stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
^
请注意,从d
到f
的更改(限制^
不是代码的一部分,只是指示查看的位置)。
答案 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);
修改 - 基于评论的措辞