Von dem, was ich verstehe, in C der unsigned
Typ wie Arithmetik verhält (unsigned
hat 32-Bit-Länge vorausgesetzt) in dem Integer-Ring Modulo 4294967296.in C unter Verwendung unsigned mit negativen temporären Ergebnissen
So scheint es zu folgen aus der grundlegenden Ringtheorie, dass, wenn wir eine ganze Zahl haben (jetzt ich meine ℤ!) Berechnung mit *
+
-
, dann egal, welche Art von Überläufen und Unterläufen vorübergehend passieren, das Endergebnis wird korrekt sein, solange das Ende Ergebnis liegt im Bereich [0, 2^32]?
Zum Beispiel in der folgenden Berechnung:
#include <stdio.h>
int main(void){
unsigned v = 50000;
unsigned w = 100000;
unsigned x = 300000;
unsigned y = 20000;
unsigned z = 4000000000;
unsigned r = v*w - x*y + z;
printf("v*w - x*y + z = %u \n", r);
return 0;
}
wir temporäre Ergebnisse, die von den Ergebnissen abweichen, die wir bekommen, wenn wir in z berechnen würden, aber wir haben noch die richtige Antwort.
Ist das richtig oder kann irgendetwas schiefgehen?
Das ist richtig. Es gibt keine negativen temporären Ergebnisse, alle Schritte werden mit modularer Arithmetik durchgeführt. – Barmar
Als eine persönliche Anmerkung: '4 * 1000 * 1000 * 1000' ist ein bisschen mehr tippen, aber viel besser lesbar (und ich bezweifle, dass Sie dies sehr oft eingeben). Zu schlecht C erlaubt keine Unterstriche in Integer-Konstanten. – Olaf
Oder '# define BILLION * 1000 * 1000 * 1000' gefolgt von' unsigned z = 4 MILLIARDE; '- Ich habe oft gefunden, dass lesbarer. Zumindest, bis wir benutzerdefinierte Literale a la C++ oder Perls schlaue '1_000_000'-Typ-Literale erhalten. – paxdiablo