9 Stimmen

Ist bei ganzen Zahlen in C++ 1 geteilt durch 2 zuverlässig gleich 0, und 3/2 = 1, 5/2 = 2 usw.?

Es gibt zwei Vektoren von unterschiedlicher, aber verwandter Größe. Der größere ist (2 * RESOLUTION) + INDEX_OFFSET (z.B. 2050) und der kleinere ist einfach RESOLUTION (z.B. 1024). Ich halte es für sicher genug, anzunehmen, dass uint16_t kann verwendet werden, um den Vektorindex zu enthalten.

Die Iteration durch den größeren Vektor erfolgt durch Inkrementierung resultIndex durch 2. Bei jeder Iteration erfolgt eine Zuordnung zum kleineren Vektor mit dem Index (resultIndex - INDEX_OFFSET) / 2 .

Im Wesentlichen beruht der Code auf der Annahme, dass, unabhängig davon, ob INDEX_OFFSET ungerade oder gerade ist, wird bei der obigen Division durch 2 immer abgerundet, unabhängig von der Architektur. Zum Beispiel, wenn resultIndex 0 oder 1 ist, wird 0 erwartet, wenn es 2 oder 3 ist, wird 1 erwartet, und so weiter. Ist dies eine sichere Annahme im Rahmen der oben genannten Parameter?

N.B. Ich erkenne die Existenz von Dividieren von Integer-Typen - Sind die Ergebnisse vorhersehbar? aber es scheint keine exakte Übereinstimmung zu sein.

17voto

Lightness Races in Orbit Punkte 367630

Ja, dies ist durch die Sprache garantiert:

[C++11: 5.6/4]: Das Binärsystem / Operator ergibt den Quotienten, und der binäre % Operator ergibt den Rest der Division des ersten Ausdrucks durch den zweiten. Wenn der zweite Operand von / ou % Null ist, ist das Verhalten undefiniert. Für ganzzahlige Operanden wird die / Operator ergibt den algebraischen Quotienten, wobei alle Nachkommastellen weggelassen werden; wenn der Quotient a/b ist im Typ des Ergebnisses darstellbar, (a/b)*b + a%b ist gleich a .

En 3/2 beide 3 y 2 sind ganzzahlige Operanden; der algebraische Quotient dieser Operation ist 1.5 , und wenn man den gebrochenen Teil verwirft .5 erhalten Sie 1 . Dies gilt auch für Ihre anderen Beispiele und, nun ja, für alle anderen Beispiele.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X