このプログラムの出力が 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);
}
パラメータの不一致が発生する可能性が最も高いのは、次のとおりです。
printf("%f\n", 5 / 2);
これは次のように記述します。
printf("%d\n", 5 / 2); // use "%d" for integer.
完全に正しいわけではありませんが、割り当てステートメントの残りの部分が印刷の失敗に寄与しているようには見えません。
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)]
スタックに 2 回 (通常は 32 ビット 0x2)プッシュします。
そして今、32ビット値= 2がどのように見えるかが最も重要です(バイナリで):
(MSB) 00000000 00000000 00000000 00000010 (LSB)
そして、このパターンが 32 ビット浮動小数点として扱われる場合の意味 (これによると) :
符号(ビット #31) = 0
指数(次の 8 ビット、つまり #30..#23) すべて = 0 も
小数部(残りのビット) には 2(dec) が含まれます
値は理論的には次のように計算されます。
(-1)^0 * (1+1*2^-22)^(0-127) = 1 * (1+2^-22)^-127
BUT exponent=0x0 は特殊なケース (リンクを読む) であり、0.0 - ピリオドとして扱われます。
使用しているコンパイラやオプションがわかりませんが、これを試してください:
printf("%f\n",(double)(5 / 2));
またはこれ:
printf("%f\n",5.0 / 2.0));