在C中从int转换为float会改变值
您好,我正在尝试将C中的在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
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-你说得对,这比我说的更好:)