私はビッグエンディアンとリトルエンディアンを研究しています。
| \
1.次のコードの目的は何ですか?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
(A)
2.コードの目的は何ですか?
私はビッグエンディアンとリトルエンディアンを研究しています。
| \
1.次のコードの目的は何ですか?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
(A)
2.コードの目的は何ですか?
'|' ビットごとのOR演算子です。基本的に値を組み合わせます。'A'は、#definehtonsからのパラメーターです。式がプログラマーやコンパイラーを混乱させないように、括弧で囲まれています。'\'は、マクロを次の行に続けます。(マクロは通常、行末で終了します。)
このマクロは、Aの16ビット値を取得し、上位8ビットをマスクします。次に、その値を取得して、右に8ビットシフトします。これは、上位8ビットが16ビット値の下部にあることを意味します。次に、Aの元の値の上位8ビットをマスクして、それらを左に8ビットシフトします。つまり、下の8ビットが上になります。最後に、2つの値を1つの値に再結合します。
最終結果は、上位バイトと下位バイトの場所が入れ替わったことです。
このコードは、標準のCプリプロセッサマクロにすぎません。
これ|
はビットごとのOR演算子です。\
エスケープは改行をエスケープして、が次の行に進むことができるようにします#define
。は(A)
マクロのパラメータです。
| 2つの整数に対してビット単位の「OR」を実行します\は、#defineが次の行に結合できるようにするエスケープ文字です
これはマクロであり、使用すると展開されます。
たとえば、マクロを次のように使用する場合( "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);
}