0

次のANSICコードを考えると、結果について疑問に思います。

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で浮動小数点変換はどのように行われますか?

4

5 に答える 5

4

標準Cでは、特に指定しない限り(19.4F、9.7Fなど)、19.4や9.7などのリテラルはdoubleと見なされます。

コンパイラは、整数除算関数を使用してx / y(xとyの両方がint(互換)タイプの場合)を計算するか、浮動小数点除算関数を使用して、xとyの少なくとも1つが浮動小数点である場合にコンピュータx/yを計算します。タイプ。

float b =(int)19.4 /(int)9.7//結果=2.000000、なぜですか?

19.4をintにキャストし、9.7をintにキャストするように要求し、コンパイラに19/9 = 2の整数除算を計算するように効果的に要求します。これは、bに格納するためにfloatにプロモートされます。2は2.0になります。

.PMCD。

于 2010-11-16T20:32:52.890 に答える
4

2行目では、入力値を整数に変換してから、整数除算を実行しています(除算の両方のオペランドが整数であるため、除算は整数空間で実行されます。つまり、小数の結果は切り捨てられます)。

したがって、19/9 = 2

次に、この整数をfloatに変換するために、暗黙的に2を2.000000に変換し直します。

于 2010-11-16T20:35:45.183 に答える
1

いいえ、2でなければなりません。intをintで割ると、intになります。したがって、2。後でそれを好きなように変換することで、ホーキーポーキーを行うことができますが、小数はすでになくなっています。

于 2010-11-16T20:35:05.463 に答える
1

2つの整数を除算すると、整数が得られます。浮動小数点数と整数を除算すると、浮動小数点数が得られます。

于 2010-11-16T20:35:23.597 に答える
1

(int) 19.4 / (int) 9.719 / 9は、最初に2(int)に解決されると同等です。2が計算された後でのみ、変数タイプによってfloatに変換されます。

于 2010-11-16T20:35:35.900 に答える