ANSIの浮動小数点変換c
-
11-10-2019 - |
質問
次のANSI Cコードを考えると、私は結果について疑問に思います:
main() {
int a = 19.4 / 9.7; // result = 2
float b = (int) 19.4 / (int) 9.7 // result = 2.000000, why?
float c = (int) 9.7; // result = 9
}
CがINTへの変換の小数点以下のすべての場所を遮断することを理解しましたが、2行目が表示された場合、私のロジックには欠陥があります。小数の場所が切断された場合、結果は2.11111でなければなりません。
ANSI Cでフローティングポイント変換はどのように行われますか?
解決
標準Cでは、19.4や9.7などのリテラルは、特に指定しない限り、2倍であると想定されています(例:19.4f、9.7f)。
コンパイラは、整数分割関数を使用してx / y(xとyの両方がint(互換)タイプの場合)またはコンピューターx / yへのフローティングポイント除算関数のいずれかを使用します。タイプ。
フロートB =(int)19.4 /(int)9.7 // result = 2.000000、なぜですか?
19.4がINTにキャストされるように、9.7をINTにキャストするよう求めており、コンパイラに19/9 = 2の整数分割を計算するようコンパイラに効果的に求めます。 2は2.0になります。
.pmcd。
他のヒント
2行目では、入力値を整数に変換してから整数分裂を行います(分裂の両方のオペランドはINTであるため、分裂は整数空間で行われます。
したがって、19 /9 = 2
次に、この整数をフロートに入れるために、2つを暗黙的に2.000000に変換します
いいえ、それは2でなければなりません。INTをINTで除算すると、INTが取得されます。したがって、2。その後、Hokey-Pokeyを好きなものに変換することができますが、デシマはすでになくなっています。
2つの整数を分割すると、整数が得られます。フロートと整数を分割すると、フロートが得られます。
(int) 19.4 / (int) 9.7
に相当します 19 / 9
, 、最初に2(int)に解決されます。 2が計算された後にのみ、可変型によってフロートに変わります。