質問

私は勉強しています ビッグエンディアンとリトルエンディアン.

1.目的は何ですか | \ 次のコードでは?

...

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

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

2.目的は何ですか (A) コードの中で?

役に立ちましたか?

解決

「|」ビットワイズまたは演算子です。基本的には値を組み合わせます。「A」は #define hton のパラメータです。式がプログラマやコンパイラを混乱させないように、括弧で囲まれています。「\」はマクロを次の行に継続します。(マクロは通常、行末で終了します。)

このマクロは、A の 16 ビット値を取得し、上位 8 ビットをマスクします。次に、その値を取得して右に 8 ビットシフトします。これは、上位 8 ビットが 16 ビット値の下位になることを意味します。次に、A の元の値の上位 8 ビットをマスクし、それらの左 8 ビットをシフトします。つまり、下位 8 ビットが上位に来ることになります。最後に、2 つの値を再結合して 1 つの値に戻します。

最終的な結果は、上位バイトと下位バイトの位置が入れ替わることになります。

他のヒント

このコードは、標準の C プリプロセッサ マクロにすぎません。

| ビット単位の OR 演算子です。の \ 改行をエスケープします。 #define 次の行に進むことができます。の (A) マクロのパラメータです。

|2 つの整数に対してビット単位の "OR" を実行します。 \ は、#define を次の行に連結できるようにするエスケープ文字です

これはマクロなので、使用すると展開されます。

たとえば、use("call") マクロを次のようにします

uint16_t i = htons(0x1234);

これは次のように展開されます。

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

それは関数内の変数とそれほど変わりません。

uint16_t htons(uint16_t A) 
{
   return (A & 0xff00) >> 8) | (A & 0x00ff) << 8);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top