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

在C中从int转换为float会改变值,c,casting,C,Casting,您好,我正在尝试将C中的int转换为float,由于某种原因,强制转换更改了值,我不知道为什么。因此: fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green); 生成两个不同的数字。请注意,rgbValues->green是一个int 知道为什么会这样吗 谢谢您必须以您的格式字符串表示。使用: fprintf(stderr, "%d,%f\n", rgbValues->green, (flo

您好,我正在尝试将C中的
int
转换为
float
,由于某种原因,强制转换更改了值,我不知道为什么。因此:

fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
生成两个不同的数字。请注意,
rgbValues->green
是一个
int

知道为什么会这样吗


谢谢

您必须以您的格式字符串表示。使用:

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

fprintf(stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
                     ^
注意从
d
f
的变化(扬抑符
^
不是代码的一部分,只是查看位置的指示器)。

在@answer上展开,您将一次转换为
float
,然后
printf
将该位模式解释为格式说明符字符串中的
int
。它正在做你让它做的事情:)

如果只想强制转换为浮动,请执行以下操作:

// 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); 

编辑-基于注释的措辞

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

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

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

顶部的注释行可能表示要进行的更改。
fprintf(stderr,“%d,%f\n”,RGB值->绿色,(float)RGB值->绿色)
应该是这样的。我看到了注释——这并没有减少代码的错误。@Adam我希望你看到
%f
应该被
%d
替换。这就是为什么我把
%f
放在
%d
的正上方。我当然看到了。我的观点是你应该真正地拼写出正确的代码,而不是复制错误的代码和笨拙的指示将要进行的更改。好了,希望这能让所有人都更加清楚。但是,需要注意的是,它们是不同类型的强制转换:第一个强制转换将整数值转换为浮点值,而第二个强制转换将浮点值重新解释为整数。它不是一个真正的双精度转换,
printf()
不知道您的数字是一个
浮点数,因此它不能将其转换回
int
(这样做是正确的,可以将相同的数字打印两次)。它只是将您发送的位模式(浮点数)解释为一个整数(因为这是你告诉它的格式字符串)和打印垃圾。@Carl-你说得对,这比我说的更好:)