Frage

Auf Linksverschiebung von (char) 0xff von 8 und Gießen es uns -256 oder 0xffffff00 bekommen int. Kann jemand erklären, warum dies geschehen soll?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

Die Ausgabe ist

-256 ffffff00
War es hilfreich?

Lösung

char kann mit oder ohne Vorzeichen - es ist die Implementierung definiert. Sie sehen diese Ergebnisse, weil char standardmäßig auf Ihrem Compiler signiert ist.

Für das signed char 0xFF entspricht -1 (das ist, wie Zweier-Komplement-Arbeit). Wenn Sie versuchen, es zu verschieben, es zuerst zu einem int gefördert wird und dann verschoben -. Sie effektiv Multiplikation erhalten, indem 256

Es ist also dieser Code:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );

Andere Tipps

Als ich das Problem sah, war meine erste Ansicht, dass das Zeichen ‚c‘ 8 Bits nach links verschoben werden soll -. Alle 8 Bits verworfen werden, würde das leere Zeichen dann 0 in einem int Wert gegossen wird

Ein bisschen Forschung zeigt, Übliche Unary Conversions - das ist, wo die große Anzahl von Rechenarten zu reduzieren, werden Konvertierungen automatisch auf die Operanden des einstellige angewendet, ‚!‘ ‚-‘ ‚~ 'und '*' Operatoren und , um jeden der Operanden des binären '<<' und 'Operatoren' >>.

Deshalb ist der char 'c' in einen int umgewandelt wird erster , dann nach links verschoben, so dass die Antwort, die Sie sehen.

Sie lernen jeden Tag etwas Neues!

c wird in einen int gefördert, bevor der Schaltvorgang durchgeführt wird. Angenommen, Ihre Implementierung macht Zeichen standardmäßig unterzeichnet, das heißt, Sie bekommen 0xffffffff gehen, die dann nach links verschoben wird Ihr Ergebnis zu geben.

Wenn Sie c in ein unsigned char machen, sollten Sie bekommen, was Sie erwarten.

char ist nichts anderes als signed char. So char c = 0xFF wird -1 sein. Wenn Sie Verschiebung nach links -1 um 8 Bits Sie -256 erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top