Was ist das Verhalten der ganzzahligen Division?

Lesezeit: 6 Minuten

Benutzeravatar von TTT
TTT

Zum Beispiel,

int result;

result = 125/100;

oder

result = 43/100;

Wird das Ergebnis immer der Boden der Division sein? Was ist das definierte Verhalten?

  • Zusammenfassung: unterzeichnet ganzzahlige Division schneidet gegen Null ab. Bei nicht negativen Ergebnissen ist dies dasselbe wie floor (runden in Richtung -Unendlich). (Beachten Sie, dass C89 dies nicht garantiert, siehe Antworten.)

    – Peter Cordes

    7. November 2017 um 4:19 Uhr


  • Jeder sagt immer wieder “in Richtung Null abschneiden” oder “Decke” oder “Boden”, als ob der Code eine bewusste Entscheidung darüber treffen würde, welche Technik verwendet werden soll. Wenn der Code sprechen könnte, würde er sagen "I just throw the dam fraction part in the trash and move on with life"

    – Timothy LJ Stewart

    8. Oktober 2018 um 3:09 Uhr


  • @TimothyL.J.Stewart Der “Code” trifft eine bewusste Entscheidung. Gemäß der Spezifikation soll die Integer-Division eine T(Runcation)-Division sein. Aus diesem Grund wird der Modulo/Rest-Operator anders implementiert als in einer anderen Sprache, beispielsweise Python oder Ruby. Sehen Dies für eine Liste mit verschiedenen Möglichkeiten, wie Sprachen den Modulo-Operator und ausführen Dies Papier, das mindestens fünf der gängigen Methoden auflistet, auf die Programmiersprachen entscheiden, div/modulo zu verwenden.

    – 13steinj

    23. Oktober 2018 um 21:22 Uhr

  • @13steinj Ich spreche umgangssprachlich gemäß den Kommentaren, die es in ein “es ist gegen Null gekürzt … nein, es ist Boden … nein, wenn es negativ ist, seine Decke …” manchmal übertragen sich technische Details nicht mit dem menschlichen Gedächtnis in die Zukunft wie wir es wünschen, aber wenn Sie intuitiv wissen, dass der “Bruchteil weggeworfen wird”, können Sie die technischen Punkte ableiten. Technische Dinge sind eine schwere Last, aber Intuition ist leicht und erfrischend wie der Wind, ich werde sie weit und breit tragen und wenn nötig weiß ich, wo ich anfangen muss. Wie das Papier, das Sie verlinkt haben, danke.

    – Timothy LJ Stewart

    24. Oktober 2018 um 0:50 Uhr

  • Ich habe hier mit Betonung auf die euklidische Teilung (Wechselspiel zwischen ganzzahliger Teilung und Modulo-Operator) geantwortet.

    – Picaud Vincent

    18. Mai 2019 um 17:25 Uhr

Benutzeravatar von dirkgently
dirkly

Wird das Ergebnis immer der Boden der Division sein? Was ist das definierte Verhalten?

Nicht ganz. Es rundet in Richtung 0 und nicht auf den Boden.

6.5.5 Multiplikative Operatoren

6 Wenn ganze Zahlen dividiert werden, ist das Ergebnis des /-Operators der algebraische Quotient, wobei alle Nachkommastellen verworfen werden.88) Wenn der Quotient a/b darstellbar ist, soll der Ausdruck (a/b)*b + a%b gleich a sein.

und die entsprechende Fußnote:

  1. Dies wird oft als „Abschneiden in Richtung Null“ bezeichnet.

Zwei Punkte sind natürlich zu beachten:

3 An den Operanden werden die üblichen arithmetischen Umwandlungen durchgeführt.

und:

5 Das Ergebnis des /-Operators ist der Quotient aus der Division des ersten Operanden durch den zweiten; das Ergebnis des %-Operators ist der Rest. Wenn der Wert des zweiten Operanden Null ist, ist das Verhalten in beiden Operationen undefiniert.

[Note: Emphasis mine]

  • … es sei denn natürlich, Sie teilen eine negative Zahl durch eine positive (oder vv), in diesem Fall ist es die Obergrenze.

    – Wird A

    30. August 2010 um 17:45 Uhr


  • Es ist weder Boden noch Decke, es ist ein Bruchteil, es ist konzeptionell anders!

    – Lornova

    30. August 2010 um 17:48 Uhr


  • @Will A: Nein. Es ist als Abschneiden gegen Null definiert. Wenn Sie es anders nennen, wird dies nur zu Verwirrung führen, also unterlassen Sie dies bitte.

    – Martin York

    30. August 2010 um 17:49 Uhr

  • Zumindest aus mathematischer Sicht ist das Abschneiden in Richtung Null gleichbedeutend mit “wenn > 0, dann Boden, sonst Decke”. Ich denke, es ist einfacher, es Kürzung zu nennen, als es Boden / Decke zu nennen, aber beides ist gültig. Ungeachtet dessen ist der Standpunkt von Will A gültig: Die Antwort von Dirkgently ist teilweise falsch, da er erklärte, dass das OP Recht hat, dass das Ergebnis der Boden der Division ist.

    – Brian

    30. August 2010 um 18:17 Uhr

  • @Philip Potter: Ich glaube nicht, dass es in C89 definiert wurde und nicht im C++-Standard von 1998. In denen natürlich (a / b) * b + a % b == a musste erfüllt werden, und der absolute Wert von a % b musste kleiner sein als aaber ob a % b war negativ für negativ a oder b wurde nicht angegeben.

    – David Thornley

    30. August 2010 um 21:28 Uhr

schots Benutzeravatar
schott

Dirkgently gibt eine hervorragende Beschreibung der ganzzahligen Division in C99, aber Sie sollten auch wissen, dass in C89 die ganzzahlige Division mit einem negativen Operanden eine implementierungsdefinierte Richtung hat.

Aus dem ANSI C Entwurf (3.3.5):

Wenn einer der Operanden negativ ist, ist es implementierungsdefiniert, ob das Ergebnis des /-Operators die größte ganze Zahl kleiner als der algebraische Quotient oder die kleinste ganze Zahl größer als der algebraische Quotient ist, ebenso wie das Vorzeichen des Ergebnisses des %-Operators. Wenn der Quotient a/b darstellbar ist, soll der Ausdruck (a/b)*b + a%b gleich a sein.

Passen Sie also mit negativen Zahlen auf, wenn Sie mit einem C89-Compiler stecken bleiben.

Es ist eine lustige Tatsache, dass C99 die Kürzung in Richtung Null gewählt hat, weil FORTRAN es so gemacht hat. Sehen diese Nachricht auf comp.std.c.

  • Und C99-Entwurf N1256 Vorwort Absatz 5 erwähnt reliable integer division als neues Sprachfeature. Toll *-*.

    – Ciro Santilli OurBigBook.com

    11. September 2016 um 8:24 Uhr

  • Abschneiden ist das Verhalten der gängigsten CPU-Hardware (z. B. x86), daher wäre es verrückt, eine andere Wahl zu treffen. IDK, das zuerst kam, Fortran-Semantik oder Hardware-Verhalten, aber es ist kein Zufall, dass diese auch gleich sind.

    – Peter Cordes

    7. November 2017 um 4:23 Uhr

  • @PeterCordes: Die üblichste CPU-Hardware könnte eine Bodendivision durch die meisten Konstanten schneller durchführen als eine Kürzungsdivision. IMHO wäre es besser gewesen, wenn der Standard das gesagt hätte expr1 / expr2 und expr1 % expr2 müssen miteinander konsistent sein, wenn beide Instanzen von expr1 dieselben Objekte auf dieselbe Weise kombinieren, und ebenso für expr2, aber die Wahl zwischen dem Abschneiden und dem Aufteilen auf dem Boden ist ansonsten nicht angegeben. Das hätte eine effizientere Codegenerierung ermöglicht, ohne viel Kompatibilität zu beeinträchtigen (und Implementierungen könnten bei Neigung ein bestimmtes Verhalten dokumentieren).

    – Superkatze

    30. Juni 2018 um 20:05 Uhr

Benutzeravatar von Leonid
Leonid

Ja, das Ergebnis wird immer gegen Null abgeschnitten. Es wird auf den kleinsten absoluten Wert gerundet.

-5 / 2 = -2
 5 / 2 =  2

Bei vorzeichenlosen und nicht negativen vorzeichenbehafteten Werten ist dies dasselbe wie floor (Rundung in Richtung -Unendlich).

  • @dan04: yep floor wäre nur für positive ganze Zahlen gültig 🙂

    – Leonid

    30. August 2010 um 17:46 Uhr

Wenn das Ergebnis negativ ist, schneidet C in Richtung 0 ab und nicht auf den Boden – ich habe diese Lektüre darüber gelernt, warum die Python-Integer-Division hier immer den Boden hat: Warum Pythons Integer Division Floors

Benutzeravatar von Mohamed El-Nakeep
Mohamed El-Nakeep

Wird das Ergebnis immer der Boden der Division sein?

Nein. Das Ergebnis variiert, aber Variationen treten nur bei negativen Werten auf.

Was ist das definierte Verhalten?

Um es klar zu machen, rundet der Boden in Richtung negative Unendlichkeit, während die ganzzahlige Division in Richtung Null rundet (abschneidet).

Für positive Werte sind sie gleich

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

Bei negativen Werten ist dies anders

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0

Benutzeravatar von adi1ya
adi1ya

Ich weiß, dass die Leute Ihre Frage beantwortet haben, aber in Laiensprache:

5 / 2 = 2 // da sowohl 5 als auch 2 ganze Zahlen sind und die Division von ganzen Zahlen immer Dezimalzahlen abschneidet

5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5 // hier hat entweder 5 oder 2 oder beide eine Dezimalzahl, daher ist der Quotient, den Sie erhalten, dezimal.

1426410cookie-checkWas ist das Verhalten der ganzzahligen Division?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy