Weisen ein int -1
zu einem unsigned
: Wie -1
nicht passt Der Bereich [0...UINT_MAX]
, Vielfache von werden hinzugefügt, bis die Antwort in Reichweite ist.Offensichtlich UINT_MAX
ist pow(2,32)-1 or 429496725
auf OP-Maschine so a
hat den Wert von .
unsigned int a = -1;
Die "%x"
erwartet "%u"
Spezifizierer ein passender unsigned
. Da diese nicht übereinstimmen: "Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten nicht definiert. Wenn ein Argument nicht der richtige Typ für die entsprechende Konvertierungsspezifikation ist, ist das Verhalten nicht definiert." C11 §7.21.6.1 9. Der printf specifier ändert nicht b
.
printf("%x\n", b); // UB
printf("%u\n", b); // UB
Der "%d"
Spezifizierer erwartet eine passende int
. Da diese nicht übereinstimmen, mehr UB.
printf("%d\n", a); // UB
Bei nicht definiertem Verhalten werden die Schlussfolgerungen nicht unterstützt.
beiden Fällen werden die Bytes gleich ist (FFFFFFFF).
Auch bei gleichem Bitmuster können unterschiedliche Typen unterschiedliche Werte haben. ffffffff
als unsigned
hat den Wert 4294967295. Als int
, abhängige Ganzzahlkodierung mit Vorzeichen, hat es den Wert -1, -2147483647 oder TBD. Als float
kann es ein NAN sein.
was ist ein nicht vorzeichenbehaftetes Wort?
unsigned
speichert eine ganze Zahl im Bereich [0 ... UINT_MAX]
. Es hat nie einen negativen Wert. Wenn der Code eine nicht negative Zahl benötigt, verwenden Sie unsigned
. Wenn der Code eine Zählnummer benötigt, die +, - oder 0 sein kann, verwenden Sie int
.
Update: einen Compiler Warnung über die Zuweisung einer unterzeichneten int
zu unsigned
, verwenden Sie die unten zu vermeiden. Dies ist eine unsigned
1u
wird negiert - was gut wie oben definiert ist. Der Effekt ist der gleiche wie ein -1
, vermittelt aber dem Compiler direkte Absichten.
unsigned int a = -1u;
Siehe auch: [** Zwei-Komplement - Wikipedia, die freie Enzyklopädie **] (https://en.wikipedia.org/wiki/Two%27s_complement) Die kurze Antwort „, wenn das höchstwertige Bit ist '1', wird es als ** negative ** Ganzzahl interpretiert." –
http://www.cplusplus.com/forum/startner/94567/ –
Ja, aber das wird mit der 'printf' Funktion gemacht, dann kann ich nicht verstehen, welche Rolle das' unsigned' Wort spielt. In meinem Beispiel könnte ich sowohl für signierte als auch für nicht signierte vars den Wert als signed oder unsigned sehen. Um zu verdeutlichen, wenn ich eine signierte var als signed oder unsigned gedruckt sehen kann, was ist "unsigned" Wort für? – rvillablanca