2 Stimmen

Um einen C-Code über die Endianness zu verstehen

Ich studiere Groß- und Kleinwüchsigkeit .

1. Was ist der Zweck von | \ in dem folgenden Code?

...

#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)

  #define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
                    (((uint16_t)(A) & 0x00ff) << 8))
...

2. Was ist der Zweck von (A) im Code?

16voto

Christopher Punkte 8508

Das '|' ist der bitweise OR-Operator. Er kombiniert im Grunde die Werte. Das 'A' ist der Parameter aus #define htons. Er ist in Klammern eingeschlossen, damit die Ausdrücke den Programmierer oder Compiler nicht verwirren. Das '\' setzt das Makro in der nächsten Zeile fort. (Ein Makro endet normalerweise am Ende der Zeile.)

Dieses Makro nimmt den 16-Bit-Wert in A und maskiert die obersten 8 Bits aus. Dann wird dieser Wert um 8 Bits nach rechts verschoben. Das bedeutet, dass sich die oberen 8 Bits nun am unteren Ende des 16-Bit-Wertes befinden. Als nächstes werden die oberen 8 Bits des ursprünglichen Werts in A ausgeblendet und um 8 Bits nach links verschoben. Das bedeutet, dass die unteren 8 Bits jetzt oben liegen. Zum Schluss werden die beiden Werte wieder zu einem Wert zusammengefügt.

Das Endergebnis ist, dass die oberen und unteren Bytes ihre Plätze getauscht haben.

4voto

Daniel A. White Punkte 180762

Dieser Code ist nichts anderes als Standard-C-Präprozessor-Makros.

El | ist der bitweise OR-Operator. Der \ umgeht den Zeilenumbruch, so dass die #define kann mit der nächsten Zeile fortfahren. Die (A) ist ein Parameter für das Makro.

3voto

HighCommander4 Punkte 46889

| führt ein bitweises "OR" an zwei Ganzzahlen durch \ ist ein Escape-Zeichen, mit dem ein #define in die nächste Zeile übernommen werden kann

2voto

nos Punkte 214143

Es ist ein Makro, es wird erweitert, wenn Sie es verwenden.

Wenn Sie z.B.("call") das Makro als

uint16_t i = htons(0x1234);

Sie wird sich ausweiten:

uint16_t i =  ((((uint16_t)(0x1234) & 0xff00) >> 8) |(((uint16_t)(0x1234) & 0x00ff) << 8));

Es ist nicht so anders als eine Variable in einer Funktion, z. B.

uint16_t htons(uint16_t A) 
{
   return (A & 0xff00) >> 8) | (A & 0x00ff) << 8);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X