4

ここに示すビットシフトの例 では:

 unsigned long int longInt = 1234567890;
 unsigned char byteArray[4];

 // convert from an unsigned long int to a 4-byte array
 byteArray[0] = (int)((longInt >> 24) & 0xFF) ;
 byteArray[1] = (int)((longInt >> 16) & 0xFF) ;
 byteArray[2] = (int)((longInt >> 8) & 0XFF);
 byteArray[3] = (int)((longInt & 0XFF));

3 つの質問:

  1. なぜ (unsigned char) ではなく (int) なのですか? unsigned char で試してみたところ、問題なくコンパイルできたようです。
  2. 0XFFは必要ですか?ウィキペディアによると、C では論理シフトと論理シフト シフトが 0 で使用されるため、新しいビットはシフトインされた 0 ではありませんか? (編集:少なくとも>> 24の場合は必要ないようです?)
  3. memcpy() を実行して longInt を unsigned char バッファにコピーすることはできませんか? エンディアンネスの問題ではないでしょうか?他に理由はありますか?
4

1 に答える 1

2

1.

((longInt >> 24) & 0xFF)式は型unsigned long intです。式へのキャストでintは、最初に に変換され、int次に に 変換されunsigned charます。式にキャストしない場合intは、最初に に変換されませんint。2 つの状況に違いはなく、キャストは不要です。

2.

0xff必要ありません。への変換は、unsigned char実際には同じことを実行します。

3.

使用できますmemcpyが、システムのエンディアンに依存するため、移植できません。システムがビッグ エンディアンまたはリトル エンディアンの場合、異なる結果が得られますが、ビットごとのシフト ソリューションでは同じ結果が得られます。

于 2012-08-26T11:06:14.603 に答える