我想知道为什么这个程序的输出是 0.0000:
{
int a = 65;
char c = (char)a;
int m = 3.0/2;
printf("%f\n", 5 / 2);
return (0);
}
我想知道为什么这个程序的输出是 0.0000:
{
int a = 65;
char c = (char)a;
int m = 3.0/2;
printf("%f\n", 5 / 2);
return (0);
}
5 / 2
是产生int
结果的整数除法。但是"%f"
printf 标志将其解释为一个double
值,这将导致未定义的行为。
在您的情况下,它打印 0.0000,但实际上它可以是任何东西。
使用浮点操作数以获得浮点返回值。
printf("%f\n", 5.0 / 2.0);
您正在打印带有%f
说明符的整数。请记住,当您将 int 除以另一个 int 时,结果又是 int。因此5/2
是使用说明符打印的整数 prints 。为了避免这种情况,这次使用双精度除以整数,从而得到双精度结果。2
%f
0.0
5.0/2
您最有可能在以下情况下出现参数不匹配:
printf("%f\n", 5 / 2);
这应该写成:
printf("%d\n", 5 / 2); // use "%d" for integer.
尽管不完全正确,但您的其余赋值语句似乎不会导致您的打印失败。
正如埃利亚斯在他的评论中指出的那样,如果另有说明,每个数字都是 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 - 句点。
不知道您正在使用什么编译器或什么选项,但试试这个:
printf("%f\n",(double)(5 / 2));
或这个:
printf("%f\n",5.0 / 2.0));
传递给 printf 的表达式的结果是整数 0('5 / 2' 是整数除法)。要纠正它:
printf("%f\n", (float) 5 / 2);
或者
printf("%f\n", 5.0 / 2.0);