unsigned/signed short/int-Konvertierung
Ich studiere signed-unsigned-integer-Konvertierungen und ich kam zu diesen Schlussfolgerungen kann mir jemand sagen, ob dieser korrekt ist, können Sie
unsigned short var = -65537u;
Schritte:
- 65537u (implizit in unsigned int)
Binäre Darstellung:
0000 0000 0000 0001 0000 0000 0000 0001
- -65537u
Binäre Darstellung: 1111 1111 1111 1110 1111 1111 1111 1111
- Abgeschnitten, zu kurz
Binäre Darstellung: 1111 1111 1111 1111
- Lesen als unsigned short: 65535
Das gleiche gilt für die folgenden Fälle:
unsigned short var = -65541u;
- 65541u (unsigned int)
0000 0000 0000 0001 0000 0000 0000 0101
- -65541u
1111 1111 1111 1110 1111 1111 1111 1011
- Abgeschnitten, zu kurz
1111 1111 1111 1011
- Lesen als unsigned short: 65531
unsigned short var = -5u;
- 5u (unsigned int)
0000 0000 0000 0000 0000 0000 0000 0101
- -5u
1111 1111 1111 1111 1111 1111 1111 1011
- Abgeschnitten, zu kurz
1111 1111 1111 1011
- Lesen als unsigned short: 65531
- Die Sprachen haben nur minimalen Größen für int und short (Sie könnten die gleiche Größe haben, oder nicht) sowie die verschiedenen binären Repräsentationen. Sie haben einige sehr spezifische Annahmen, die nicht universell gültig. Zum Beispiel
5
und-5
möglicherweise unterscheiden sich nur im Vorzeichen-bit. - Es ist wahr, dass
-5
kann nicht dargestellt werden in 2 ergänzen, aber das ist nicht relevant für die Frage, wie die Frage sich nicht um alle negative Zahl. In dieser Frage, unäre negation ist nur bei unsigned-Typen. Zum Beispiel-65537u
wird analysiert, wie-(65537u)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Analyse ist richtig für die üblichen Plattformen, auf denen
short
ist 16 bits undint
ist 32 bit.Für einige Plattformen, die ständige
65537
passt möglicherweise nicht in einemunsigned int
, aber wenn das der Fall65537u
eingegeben werden, da eine größere vorzeichenloser Typ. Die Liste der Arten, die versucht werden, finden Sie in Abschnitt 6.4.4.1:5 der C99-standard. In C99 wird es zumindest passen in eineunsigned long
, garantiert von der Norm zu ermöglichen, Werte, die große.Die Argumentation bleibt viel von der gleichen, wenn das passiert, bis die Umwandlung zurück zur
unsigned short
für die Zuordnung.Umgekehrt
unsigned short
von der C99-standard zu halten, mehr als 16 bit. In diesem Fallvar
erhältUSHRT_MAX-65536
für dein erstes Beispiel und ähnlich für die anderen.Die Größe der kurze ist von der Implementierung abhängig - nicht 16bit. 16bit ist die minimale Größe.
Similairly die Größe eines int kann nur 16bit auch.
short
32-bit -int
Typen, und sollte sagen damit explizit, aber das ist ein Kommentar auf die Frage, nicht eine Antwort.