2016-12-03 4 views
0

Nicht wenige ähnliche Fragen gestellt wurden, aber es verwirrt mich noch, wieUnsigned -1 = unterzeichnet -1

unsigned int a = -1; 
int b = ~0; 
if (a == b) 
    printf("%u\t%d", a, b); 

kehrt

4294967295 -1

Ich verstehe wie die Werte in C gespeichert sind und warum diese Zahlen angezeigt werden, aber meine Frage ist, wie geht a==btrue hier zurück?

+2

Ich habe das C-Tag hinzugefügt, da Sie es scheinbar verwenden. –

+0

Warum unterscheidet es sich von der Frage in der obigen Verknüpfung, ist, dass die Variable ohne Vorzeichen initialisiert wird als "-1" - ein negativer Wert. Die Frage hier ist über den Vergleich – Paulo

Antwort

3

Nach Regeln gemischter vorzeichenbehafteter-unsignierter Vergleiche ist a == b äquivalent zu a == (unsigned) b, d. H. Der Vergleich wird in der Domäne des vorzeichenlosen Typs durchgeführt.

Das Ergebnis von ~0 ist das Einsen-Bit-Muster. In vorzeichenbehafteten Integer-Typen repräsentiert dieses Muster -1 auf einer 2'-Komplement-Plattform. Was bedeutet, dass Sie Ihre b mit -1 initialisiert haben (wie von Ihrer printf bestätigt).

Also, Ihr Vergleich ist effektiv (unsigned) -1 == (unsigned) -1. Kein Wunder, dass es wahr ist.

Aber bedenken Sie, dass die Gleichheit immer noch implementierungsabhängig ist, da sie von den Eigenschaften der Zweierkomplementdarstellung abhängt. Solange die C-Sprache offiziell alternative Ganzzahldarstellungen mit Vorzeichen unterstützt (Vorzeichen und Betrag, 1er-Komplement), hängt die Gleichheit davon ab.

+0

Anstatt zu sagen, dass der Vergleich in der Domäne des unsigned-Typs durchgeführt wird, sollten Sie sagen, dass der Vergleich nach und nach gemacht wird. Tatsächlich ist hexadezimal a gleich 0xFFFFFFFF (32-Bit-Plattform) mathematisch -1 = (-2^31 + 2^31 - 1) = (0xFFFFFFFF) in 2s-Komplementdarstellung. Und b = ~ 0 setzt alle Bits auf 1, die hexadezimal b = 0xFFFFFFFF ergeben. Das erklärt, dass die if-Bedingung wahr ist. – shamba

+0

@shamba: Absolut nicht! Im Gegenteil, die C-Sprache macht einen Vergleich gemäß den Regeln der C-Sprache, nicht "Stück für Stück". Es gibt keine "Bit für Bit" Vergleiche in C. In diesem Fall haben wir ein bisschen Glück, weil wir 2'-Komplement-Maschinen verwenden, wobei signiertes '~ 0'' -1' ergibt. Auf einer 1'-Komplementärmaschine würde '~ 0' nicht '-1' ergeben ('0xFFFFFFFF' ist dort 'negative Null') und die Gleichheit würde nicht gelten, obwohl die zugrundeliegenden rohen Darstellungen immer noch "bitweise" übereinstimmen würden. . – AnT

+0

@AnT können Sie einen Verweis auf ein Material einfügen? mit Bezug auf den Vergleich wird gleichgesetzt mit ((vorzeichenlos) -1 == (vorzeichenlos) -1). Ich verstehe, wie b -1 wird, wusste schon, aber der Vergleich? – Paulo

Verwandte Themen