Ich denke, der einfachste Weg, dies zu erklären, wäre, es in die Reihenfolge der Operationen aufzuteilen, die Sie ausführen
Instance | # int | char | # byte | result |
Source | 11 11 11 11 | 11 11 11 11 | 11 11 11 11 | 11 11 11 10 | -2 |
byte |(11 11 11 11)|(11 11 11 11)|(11 11 11 11)| 11 11 11 10 | -2 |
int | 11 11 11 11 | 11 11 11 11 | 11 11 11 11 | 11 11 11 10 | -2 |
char |(00 00 00 00)|(00 00 00 00)| 11 11 11 11 | 11 11 11 10 | 65534 |
int | 00 00 00 00 | 00 00 00 00 | 11 11 11 11 | 11 11 11 10 | 65534 |
- Sie nehmen einfach einen vorzeichenbehafteten 32-Bit-Wert.
- Sie konvertieren es dann in einen 8-Bit-Wert mit Vorzeichen.
- Wenn Sie versuchen, es in einen vorzeichenlosen 16-Bit-Wert zu konvertieren, schleicht sich der Compiler schnell in einen vorzeichenbehafteten 32-Bit-Wert um.
- Konvertieren Sie es dann in 16 Bit, ohne das Vorzeichen beizubehalten.
- Wenn die endgültige Konvertierung in 32-Bit erfolgt, gibt es kein Vorzeichen, sodass der Wert null Bits addiert, um den Wert beizubehalten.
Also, ja, wenn Sie es so betrachten, ist die Byte-Besetzung signifikant (akademisch gesehen), obwohl das Ergebnis unbedeutend ist (Freude an der Programmierung, eine signifikante Aktion kann einen unbedeutenden Effekt haben). Der Effekt der Verengung und Verbreiterung unter Beibehaltung des Zeichens. Wobei sich die Umwandlung in char verengt, sich aber nicht erweitert, um zu unterschreiben.
(Bitte beachten Sie, dass ich ein # verwendet habe, um das vorzeichenbehaftete Bit zu kennzeichnen. Wie bereits erwähnt, gibt es kein vorzeichenbehaftetes Bit für char, da es sich um einen vorzeichenlosen Wert handelt.)
Ich habe Parens verwendet, um darzustellen, was tatsächlich intern passiert. Die Datentypen sind tatsächlich in ihren logischen Blöcken zusammengefasst, aber wenn sie wie in int betrachtet werden, sind ihre Ergebnisse das, was die Parens symbolisieren.
Vorzeichenbehaftete Werte erweitern sich immer mit dem Wert des vorzeichenbehafteten Bits. Unsigned erweitert sich immer mit dem Bit aus.
* Der Trick (oder die Fallstricke) besteht darin, dass die Erweiterung von Byte auf int den vorzeichenbehafteten Wert beibehält, wenn sie erweitert wird. Was sich dann verengt, sobald es den Saibling berührt. Dies schaltet dann das vorzeichenbehaftete Bit aus.
Wenn die Konvertierung in int nicht stattgefunden hätte, wäre der Wert 254 gewesen. Aber das tut es, also ist es nicht.
byte
Besetzung das Ergebnis nicht ändert, bedeutet nicht, dass sie nichts tut ...