Warum hat unsigned int negative Zahlen enthalten

8

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

    
Muhammad Hewedy 11.05.2010, 02:57
quelle

4 Antworten

22

%i ist der Formatbezeichner für eine signierte Ganzzahl; Sie müssen %u verwenden, um eine Ganzzahl ohne Vorzeichen zu drucken.

    
James McNellis 11.05.2010, 02:59
quelle
8

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. :)

    
Dustin 11.05.2010 03:03
quelle
6

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.

    
progrmr 11.05.2010 23:48
quelle
1

Da in der Summe gespeicherte vorzeichenlose int-Werte in printf% i

    
Andrew Florko 11.05.2010 03:01
quelle

Tags und Links