私はbig and little-endiannessを勉強しています。エンディアンに関するCコードを理解するには
1. | \
の目的は次のコードに含まれていますか?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2.コードで(A)
の目的は何ですか?
ありがとうございました! –
マスクと0xff00または&0x00ffのどちらも必要ありません。最初のケースでは、下から8ビットはマスクされます。後者の場合、ビットはオーバーフローして失われます。 (uint16_t)((uint16_t)(A)>> 8)|((uint16_t)(A)<< 8)))は同じ結果になります –
@Tom Leysは2番目のケースについて同意しません。 '(((uint16_t)(A))<< 8))'となります。 'A'はその16個のLSビットを保持する' uint16_t'にキャストされます。次に、通常の整数宣伝が考えられます。これは例えば32ビットの 'int'になります。その値はシフト8されます。 – chux