Frage

der folgende ANSI-C-Code Da frage ich mich, über die Ergebnisse:

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
}

Es verstand, dass C alle Dezimalstellen abgeschnitten wird auf der Umstellung auf int aber meine Logik hat einen Fehler, wenn ich die zweite Linie zu sehen. Wenn die Dezimalstellen geschnitten sind, muss das Ergebnis 2,11111 sein.

Wie wird die Gleitkomma-Konvertierung durchgeführt in ANSI C?

War es hilfreich?

Lösung

In Standard-C, wie Literale als 19,4 und 9,7 angenommen doppelt sein, wenn Sie nichts anderes angeben (zB. 19.4F, 9.7F).

Der Compiler wird entweder die ganzzahlige Division Funktion zu berechnen x / y verwenden (wenn beide x und y von int sind (kompatibel) Typ) oder die Gleitkomma-Divisionsfunktion an den Computer X / Y, wenn atleast eines von x und y ein Gleitkomma-Typ.

float b = (int) 19,4 / (int) 9.7 // result = 2.000000, warum?

Sie fordern 19,4 bis int gegossen wird, und 9,7 cast int zu sein, effektiv die Compiler bitten die Integer-Division von 19/9 = 2, zu berechnen, die dann für die Lagerung in b schweben gefördert wird. 2 wird 2,0.

.PMCD.

Andere Tipps

In Zeile 2, die Sie konvertieren die Eingangswerte auf ganze Zahlen, und dann eine ganze Zahl divide tun (weil beiden Operanden für die Kluft Ints sind, die Kluft in ganzzahligen Raum getan - das jede gebrochene resiult bedeutet werden abgeschnitten).

So, 19/9 = 2

Dann diese ganze Zahl in einen Schwimmer zu bekommen, es implizit konvertiert 2 zurück zu 2,000000

No, it must be 2. When you divide an int by an int, you get an int. Thus 2. You can do the hokey-pokey afterwards converting it to whatever you like, but the decimals are already gone.

Divide two integers and you will get an integer. Divide a float and an integer and you will get a float.

(int) 19.4 / (int) 9.7 is equivalent to 19 / 9, which first gets resolved into 2 (an int). Only after the 2 is calculated is it turned into a float by the variable type.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top