Was ich über unsigned numerics (unsigned short, int und longs) weiß, dass es nur positive Zahlen enthält, aber das folgende einfache Programm hat erfolgreich eine negative Zahl einem unsigned int zugewiesen:
%Vor% Die Ausgabe ist:
The subtraction of 10 from 20 is -10
%i
ist der Formatbezeichner für eine signierte Ganzzahl; Sie müssen %u
verwenden, um eine Ganzzahl ohne Vorzeichen zu drucken.
Mit printf
gibt das %i
format ein signed int
aus. Verwenden Sie %u
, um unsigned int
auszugeben. Dies ist ein häufiges Problem beim Starten der C-Programmierung. Um Ihre Frage zu beantworten, ist das Ergebnis von v1 - v2
-10, aber sum
ist ein unsigned int
, also lautet die wirkliche Antwort wahrscheinlich etwa 4294967286 (2 32 - 10). Sehen Sie, was Sie bekommen, wenn Sie The subtraction of %i from %i is %u \n
verwenden. :)
Signed int und unsigned int haben die gleiche Größe im Speicher, der einzige Unterschied zwischen ihnen ist, wie Sie sie interpretieren. Signierte Werte verwenden eine Zweierkomplementdarstellung.
Wenn Sie 0xFFFFFFFF in einen 4-Byte-Speicherort schreiben und dann fragen, was ist der Wert dort? Nun, wenn wir es als vorzeichenbehafteten int interpretieren, dann ist es -1, aber wenn wir es als unsigned int interpretieren, dann ist der Wert 4294967295. So oder so, es ist das gleiche Bitmuster, der Unterschied ist, was Sie sagen.
Wenn Sie einem unsignierten int 10-20 zugewiesen haben, haben Sie einen Wert von -10 berechnet (C führt keine Überlauf- oder Unterlaufüberprüfung durch), das ist ein Bitmuster von 0xFFFFFFF6, was -10 in einem vorzeichenbehafteten int oder 4294967286 bedeutet in einem unsigned int. Wenn Sie dann den Compiler (mit% i) anweisen, ein vorzeichenbehaftetes int zu drucken, dann interpretiert er dieses Bitmuster als signed int und gibt -10 aus, wenn Sie dem Compiler (unter Verwendung von% u) ein unsigned int dann ausgeben interpretiert dieses Bitmuster als unsigned und druckt 4294967286.
Da in der Summe gespeicherte vorzeichenlose int-Werte in printf% i