2016-10-08 5 views
2

Ich fing gerade an, c Sprache zu lernen. Ich habe eine Frage zum Ergebnis bitweiser Operationen. Warum erhalten wir im folgenden Code ein anderes Ergebnis von c und d? Wie haben wir 72 als Wert von d?Verwirrung in der bitweisen Operation

char a = 41;//101001 
char b = (a<<5);//32 or 100000 
char c = (b>>2);//8 or 1000 
char d = (a<<5)>>2;//72 or 1001000 
printf("a= %d , b=%d, b=%d , d=%d\n", a, b,c,d); 

Antwort

3

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.

+1

OP auch gefragt "Wie haben wir 72 als Wert von d?" (zu der die Antwort "(char) sein könnte (a <<5) >> 2') –