2015-01-24 19 views
5

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?

+0

Was ist, wenn ich eine integrale Division haben möchte? Was mache ich dann? – Borgleader

+9

Es entspricht der Entscheidung von CPU-Designern. –

+5

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

Antwort

9

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 oder E1/E2 oder E1 rem E2 oder E1 + E2 oder +E1 oder E1 - 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 durch E1E2 wenn E1 teilbar durch E2 ergibt; es ist ansonsten implementierungsabhängig, aber der Rundungsfehler ist niemals größer als 1.

Der Operator rem ergibt den Rest von E1 dividiert durch E2; 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.

Verwandte Themen