为什么输出0.0000?

时间:2013-11-04 15:46:43

标签: c

我想知道为什么这个程序的输出是0.0000:

{
    int a = 65;
    char c = (char)a;
    int m = 3.0/2;
    printf("%f\n", 5 / 2);
    return (0);
}

6 个答案:

答案 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)

enter image description here

现在理论值 的值应计算为:

  

( - 1)^ 0 *(1 + 1 * 2 ^ -22)^(0-127)= 1 *(1 + 2 ^ -22)^ - 127

exponent = 0x0这是特殊情况(读取链接)并被视为0.0 - 句点。