Wenn irgendein Typ oder arithmetische Operation auf einem Typ kleiner als int
durchgeführt wird, wird der Wert auf int
innerhalb des Ausdrucks gefördert. Wenn das Ergebnis dann in einem char
gespeichert wird, werden alle außer dem Byte niedrigster Reihenfolge abgeschnitten.
Diese 6.3.1.1 der C standard in Abschnitt behandelt:
Folgendes kann in einem Ausdruck verwendet werden, wo immer ein int
oder unsigned int
kann verwendet werden:
- Ein Objekt oder Expression mit einem ganzzahligen Typ (anders als int
oder unsigned int
), dessen ganzzahliger Umwandlungsrang kleiner als oder gleich dem Rang von int
undist.
- Ein Bitfeld vom Typ _Bool
, int
, signed int
oder unsigned int
.
Wenn ein int
alle Werte des ursprünglichen Typs (wie durch die Breite beschränkt, für ein Bit-Feld) darstellen kann, ist der Wert auf ein int
umgewandelt; andernfalls wird es in eine unsigned int
umgewandelt. Diese werden Integer-Promotionen genannt. Alle anderen Typen sind durch die Ganzzahl-Promotions unverändert.
Im Fall von c
, tun Sie zuerst a<<5
. Bevor dies geschieht, wird der Wert a
in diesem Ausdruck in int
heraufgestuft, sodass das Ergebnis größer als char
sein kann.
Daraus ergibt sich der Binärwert 10100100000
(Dezimal 1312). Dieser wird dann unter b
mit dem Typ char
gespeichert, sodass nur die unteren 8 Bits (00100000
, Dezimalzahl 8) beibehalten werden. So hat b
nun den Wert von 8.
Dann führen wir b>>2
uns binäre 00001000
(dezimal 8) zu geben, die in c
gespeichert wird.
Im Fall von d
führen wir a<<5
wie zuvor (mit dem Wert von a
zu int
gefördert) binären 10100100000
bekommen. Jetzt wird dieser Wert um 2 nach rechts verschoben, was zu 00101001000
(Dezimal 328) führt. Dies wird dann unter d
vom Typ char
gespeichert, so dass nur die unteren 8 Bits gespeichert werden (01001000
, dezimal 72). So d
jetzt als der Wert von 72.
OP auch gefragt "Wie haben wir 72 als Wert von d?" (zu der die Antwort "(char) sein könnte (a <<5) >> 2') –