我想知道为什么这个程序的输出是0.0000:
{
int a = 65;
char c = (char)a;
int m = 3.0/2;
printf("%f\n", 5 / 2);
return (0);
}
答案 0 :(得分:5)
5 / 2
是整数除法,产生int
结果。但是"%f"
printf标志将其解释为double
值,这将导致未定义的行为。
在你的情况下,它打印0.0000,但它可能是任何东西,真的。
使用浮点操作数以获得浮点返回值。
printf("%f\n", 5.0 / 2.0);
答案 1 :(得分:2)
您正在使用%f
说明符打印整数。请记住,当您将int除以另一个int时,结果又是int。因此5/2
是整数 2
,其中使用%f
说明符打印0.0
。为了避免这种情况,请使用5.0/2
这次将double除以整数,从而获得 double 结果。
答案 2 :(得分:1)
你最喜欢参数不匹配:
printf("%f\n", 5 / 2);
这应该写成:
printf("%d\n", 5 / 2); // use "%d" for integer.
虽然不完全正确,但其余的作业声明似乎不会导致您的打印失败。
答案 3 :(得分:0)
不知道您使用的是哪种编译器或选项,但请尝试以下方法:
printf("%f\n",(double)(5 / 2));
或者这个:
printf("%f\n",5.0 / 2.0));
答案 4 :(得分:0)
传递给printf的表达式的结果是整数0('5/2'是整数除法)。要纠正它:
printf("%f\n", (float) 5 / 2);
或
printf("%f\n", 5.0 / 2.0);
答案 5 :(得分:0)
正如Elias在他的评论中所指出的,如果另有说明,每个数字都是int。这是解决方案的关键。
在C / C ++中,5/2是int数,等于2 这就是你的原因:
printf("%f\n", 5 / 2);
与:
相同printf("%f\n", 2);
但是为什么它打印0.0你问 - 这就是原因。 当printf被赋予'%f'标志时,它会将参数视为float。
现在你的代码反汇编看起来像/可能看起来像那样:
printf("%f\n", 5 / 2);
push 2
call dword ptr [__imp__printf (0B3740Ch)]
push 2 在堆栈上移动(通常是32位0x2)
现在最重要的是32位值= 2看起来(二进制):
(MSB)00000000 00000000 00000000 00000010(LSB)
如果将此模式视为32位浮点(根据this),则该模式意味着什么:
签名(位#31)= 0
exponent (接下来的8位,即#30 ..#23)all = 0
分数(其余位)包含2(dec)
现在理论值 的值应计算为:
( - 1)^ 0 *(1 + 1 * 2 ^ -22)^(0-127)= 1 *(1 + 2 ^ -22)^ - 127
但 exponent = 0x0这是特殊情况(读取链接)并被视为0.0 - 句点。