Warum, wenn ich zwei Integer-Zahlen dividiere, ist das Ergebnis eine Ganzzahl und kein Float. Warum wurde diese Design-Entscheidung gewählt?Warum int/int = int?
Antwort
Als früher C entwickelt wurde, hatte eine Menge moderner Hardware keine Gleitkommaunterstützung.
Wenn Gleitkomma-Typen zu C über seine Vorgänger hinzugefügt wurden (BCPL und B), wurde die Ganzzahl-Semantik des Divisionsoperators unverändert gelassen.
Die BCPL manual sorgt für eine interessante Lektüre (Hervorhebung von mir):
5,1 arithmetische Ausdrücke
syntaktische Form:
E1 * E2
oderE1/E2
oderE1 rem E2
oderE1 + E2
oder+E1
oderE1 - E2
oder-E1
Semantik: Alle diese Operatoren interpretieren die R-Werte ihrer Operanden als Ganzzahlen mit Vorzeichen, und alle Ausbeute ganzzahlige Ergebnisse.
...
Der Divisionsoperator
/
das korrekte Ergebnis der [die Teilung durchE1
E2
wennE1
teilbar durchE2
ergibt; es ist ansonsten implementierungsabhängig, aber der Rundungsfehler ist niemals größer als 1.Der Operator
rem
ergibt den Rest vonE1
dividiert durchE2
; Die genaue Spezifikation ist abhängig von der Implementierung.
Es ist klar, dass Portabilität kein Problem war und die Sprache durfte tun, was auch immer die zugrunde liegende Hardware tat.
Noch heute gibt es viele Plattformen, die C unterstützen, aber keine Fließkomma-Hardware haben (zum Beispiel kleine eingebettete Plattformen).
Einige moderne übergeordnete Sprachen wählen int/int
als Gleitkommadivision zu definieren. Zum Beispiel, Python 3, und hat einen separaten Operator, //
, für Integer-Division. Interessanterweise hat dieser Integer-Divisionsoperator rounding rules that are different to its C counterpart. [*]
Wenn Sie sich für die Geschichte von C interessieren, werfen Sie einen Blick auf The Development of the C Language von Dennis Ritchie.
[*] Python-Ganzzahlen sind auch interessant, dass sie arbitrary-precision sind.
- 1. Warum (int) ((unsigned int) ((int) v)?
- 2. Warum funktioniert Decimal.Divide (int, int), aber nicht (int/int)?
- 3. Warum kompiliert int main() {}?
- 4. Warum ist 1e400 kein int?
- 5. Warum Int implementiert "Monoid" nicht?
- 6. Warum funktioniert nicht! Int() ordnungsgemäß?
- 7. Warum Vergleich nicht eine int
- 8. int a = (int) ((0,7 + 0,1) * 10). Warum a = 7?
- 9. Warum erbt Int nicht/extend von Ordered [Int]
- 10. Warum Java 8 einführen * Integer.sum (int a, int b) *
- 11. Über virtuelle Funktionen, warum sind gedruckte Werte von * (int *) & b und (int *) * (int *) & b anders?
- 12. Warum gibt int = int * double einen Fehler und int * = double nicht (in Java)?
- 13. Typ int * (*) (int *, int * (*)())
- 14. Warum ist float() schneller als int()?
- 15. Warum ist neu int (*) [3] ein Fehler?
- 16. Warum gibt (int) (33.46639 * 1000000) 33466389 zurück?
- 17. Warum Array als "int * & name" übergeben?
- 18. Warum Java AutoBox nicht int [], um Integer []
- 19. Warum unsigned int enthielt negative Zahl
- 20. Warum schlägt Int vs bool Typcheck fehl
- 21. Warum java.util.concurrent.atomic.AtomicBoolean wird intern mit int implementiert?
- 22. Warum löst List.remove (int) java.lang.UnsupportedOperationException aus?
- 23. Warum Int ist verengt, um zu schwimmen?
- 24. Overriding- Warum lang anstelle von int
- 25. Warum kann Java 0xff000000 als int speichern?
- 26. Warum gibt Dappers .Execute (...) ein int zurück?
- 27. Warum benutzt `Int32`` int` im Quellcode?
- 28. Kann ich einem shared_ptr 0 zuweisen? Warum?
- 29. int * const AND extern int *
- 30. Wie deserialize [[int, int, int, int, string, string], [...]] von JSON
Was ist, wenn ich eine integrale Division haben möchte? Was mache ich dann? – Borgleader
Es entspricht der Entscheidung von CPU-Designern. –
Offen gesagt, weil es am meisten Sinn macht. Wenn Sie zwei 'int' hinzugefügt hätten, würden Sie erwarten, dass ein' int' zurückgegeben wird? Na sicher! Das gleiche gilt für alle anderen mathematischen Operationen. Warum sollten sie eine Ausnahme für die Division machen? – CoryKramer