可能重复:
打印浮点值在整数C语言
我想了一个相当简单的代码是这样的:
float a = 1.5;
printf("%d",a);
它打印出0
。 然而,对于其他值,比如1.4,1.21等,则打印出一个垃圾值。 不仅为1.5,1.25,1.5,1.75,1.3125(换言之,十进制数可被完美地转换成二进制形式),则打印0
。 这背后有什么原因? 我发现了一个类似的帖子在这里 ,和第一个答案看起来像一个真棒答案,但我无法辨别它。 任何机构可以解释为什么会出现这种情况? 发生了什么字节序了与T呢?
你不投浮动, printf
只是将其解释为一个整数,这就是为什么你得到看似无用值。
编辑:
检查此示例C代码,其示出了如何double
存储在存储器中:
int main()
{
double a = 1.5;
unsigned char *p = &a;
int i;
for (i=0; i<sizeof(double); i++) {
printf("%.2x", *(p+i));
}
printf("\n");
return 0;
}
如果运行与1.5
它打印
000000000000f83f
如果用1.41试试它打印
b81e85eb51b8f63f
所以,当printf
解释1.5
作为一个int,它打印为零,因为4个LSB是零,并试图在其他值1.41
。
话虽这么说,它是一个未定义的行为 ,你应该避免,再加上你不会总是得到它取决于在机器上和参数如何传递相同的结果。
注 :该字节被颠倒,因为这是一个小印第安机 ,这意味着至少显著字节的编译是第一位的。
你不照顾有关参数提升。 因为printf
是一个可变参数函数,参数提升:
C11(n1570),第6.5.2.2函数调用
有float类型的参数都提升到两倍。
所以printf
试图解释你的double
变量作为整数类型。 这将导致未定义行为。 只需添加一投:
double a = 1.5;
printf("%d", (int)a);
在参数不匹配printf
是undefined beahivour
或者强制转换a
或使用%f
用这样的方式
printf("%d",(int)a);
要么
printf("%f",a);
d代表: decimal
。 如此,不过一个是浮点/双/整数/炭....当您使用“%d”,C将用十进制打印数量。 所以,如果一个是整数类型(整型,长),没有问题。 如果是char:因为char是一个整数类型,所以,C将在ASCII字符打印的价值。
但是,问题出现了,当是浮动型(浮点/双),只是因为如果是浮动型,C将要读这一点,但不是小数方式特殊方式。 所以,你将有奇怪的结果。
为什么有这种奇怪的结果呢?
我只是给一个简短的解释:在计算机,实数是由两个部分呈现exponent
和mantissa
。 如果你说:这是一个实数,C就知道这是指数,这是尾数。 但是,因为你说:嘿,这是整数。 指数部分和尾数部分没有区别 - >奇怪的结果。
如果你想了解究竟,怎样才能知道哪些整数将它打印(当然,你可以猜测)。 您可以访问此链接: 用C表示内存浮点数
如果你不希望有这种TRANGE结果,你可以投int
浮动,因此,它会打印的浮点数的整数部分。
float a = 1.5;
printf("%d",(int)a);
希望这有助于:)