Ich muss 2 vorzeichenlose 8-Bit-Werte nehmen und sie subtrahieren, dann diesen Wert zu einem 32-Bit-Akkumulator hinzufügen. Die 8-Bit-Subtraktion kann unterlaufen, und das ist in Ordnung (vorzeichenloser int-Unterlauf ist definiertes Verhalten, also keine Probleme dort).Warum ist static_cast auf einen Ausdruck verteilt?
Ich würde erwarten, dass static_cast<uint32_t>(foo - bar)
tun sollte, was ich will (wo foo
und bar
sind beide uint8_t
). Aber es scheint, dass dies sie zuerst wirft und dann führt eine 32-Bit-Subtraktion, während ich es als 8-Bit-Variable unterlaufen muss. Ich weiß, ich könnte nur mod 256, aber ich versuche herauszufinden, warum es funktioniert so.
Beispiel hier: https://ideone.com/TwOmTO
uint8_t foo = 5;
uint8_t bar = 250;
uint8_t diff8bit = foo - bar;
uint32_t diff1 = static_cast<uint32_t>(diff8bit);
uint32_t diff2 = static_cast<uint32_t>(foo) - static_cast<uint32_t>(bar);
uint32_t diff3 = static_cast<uint32_t>(foo - bar);
printf("diff1 = %u\n", diff1);
printf("diff2 = %u\n", diff2);
printf("diff3 = %u\n", diff3);
Ausgang:
diff1 = 11
diff2 = 4294967051
diff3 = 4294967051
Ich würde vermuten diff3
das gleiche Verhalten wie diff1
haben würde, aber es ist eigentlich die gleiche wie diff2
.
Warum passiert das? Soweit ich das beurteilen kann, sollte der Compiler die beiden 8-Bit-Werte subtrahieren und dann auf 32-Bit umwandeln, aber das ist eindeutig nicht der Fall. Hat das etwas mit der Spezifikation zu tun, wie sich static_cast
auf einem Ausdruck verhält?
Dies ist ein Beispiel von * integraler Förderung * über die * üblichen arithmetischen Umwandlungen *. Es wird wegen des Subtraktionsausdrucks angewendet, nicht des 'static_cast'. – dyp
Warum würden Sie denken, dass diff2 dasselbe wie diff1 wäre? diff2 führt die Subtraktion mit zwei 'uint32_t's eindeutig aus. Was das Ergebnis von diff3 betrifft - der Compiler hat entschieden, dass es das Richtige ist (was es ist, es wird Ihnen die korrekteste Antwort geben). Wenn du willst, dass es etwas anderes macht, musst du es ihm sagen. – mbgda
@mbgda Sie erwarten, dass diff3 und diff1 gleich sind. –