質問
私は勉強しています ビッグエンディアンとリトルエンディアン.
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);
}
所属していません StackOverflow