2

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

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

6 回答 6

7

5 / 2是产生int结果的整数除法。但是"%f"printf 标志将其解释为一个double值,这将导致未定义的行为。
在您的情况下,它打印 0.0000,但实际上它可以是任何东西。

使用浮点操作数以获得浮点返回值。

printf("%f\n", 5.0 / 2.0);
于 2013-11-04T15:48:14.407 回答
2

您正在打印带有%f说明符的整数。请记住,当您将 int 除以另一个 int 时,结果又是 int。因此5/2是使用说明符打印的整数 prints 。为了避免这种情况,这次使用双精度除以整数,从而得到双精度结果。2%f0.05.0/2

于 2013-11-04T15:51:07.420 回答
1

您最有可能在以下情况下出现参数不匹配:

printf("%f\n", 5 / 2);  

这应该写成:

printf("%d\n", 5 / 2);  // use "%d" for integer.  

尽管不完全正确,但您的其余赋值语句似乎不会导致您的打印失败。

于 2013-11-04T15:51:13.217 回答
0

正如埃利亚斯在他的评论中指出的那样,如果另有说明,每个数字都是 int 。这是解决问题的关键。

在 C/C++ 中 5/2 是 int number 并且等于 2 这就是为什么你的:

printf("%f\n", 5 / 2);

是相同的:

printf("%f\n", 2);

但是为什么它打印 0.0 你问 - 这就是为什么。当 printf 被赋予 '%f' 标志时,它会将参数视为浮点数。

现在您的代码反汇编看起来/可能看起来像这样:

printf("%f\n", 5 / 2);
push        2    
call        dword ptr [__imp__printf (0B3740Ch)]

将 2 次移动(通常是 32 位 0x2)压入堆栈

现在最重要的是 32 位 value=2 的外观(二进制):

(MSB) 00000000 00000000 00000000 00000010 (LSB)

如果将其视为 32 位浮点(根据this),则此模式意味着什么:

符号(第 31 位)= 0

指数(接下来的 8 位,即 #30..#23)all = 0 too

分数(剩余位)包含 2(dec)

在此处输入图像描述

现在该值理论上应该计算为:

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

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

于 2013-11-05T16:10:00.237 回答
0

不知道您正在使用什么编译器或什么选项,但试试这个:

printf("%f\n",(double)(5 / 2));

或这个:

printf("%f\n",5.0 / 2.0));
于 2013-11-04T15:50:22.947 回答
0

传递给 printf 的表达式的结果是整数 0('5 / 2' 是整数除法)。要纠正它:

printf("%f\n", (float) 5 / 2);

或者

printf("%f\n", 5.0 / 2.0);
于 2013-11-04T15:50:43.927 回答