2

私はビッグエンディアンとリトルエンディアンを研究しています。

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

...

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

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

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

4

4 に答える 4

16

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

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

最終結果は、上位バイトと下位バイトの場所が入れ替わったことです。

于 2009-07-21T00:20:14.310 に答える
4

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

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

于 2009-07-21T00:16:50.843 に答える
3

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

于 2009-07-21T00:16:41.483 に答える
2

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

たとえば、マクロを次のように使用する場合( "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);
}
于 2009-07-21T00:20:35.603 に答える