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.
Ich habe das C-Tag hinzugefügt, da Sie es scheinbar verwenden. –
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