4

ここでは 、bytes バッファから unsigned long int に変換する場合:

  unsigned long int anotherLongInt;

  anotherLongInt = ( (byteArray[0] << 24) 
                   + (byteArray[1] << 16) 
                   + (byteArray[2] << 8) 
                   + (byteArray[3] ) );

byteArray は次のように宣言されます。unsigned char byteArray[4];

質問:

byteArray[1]符号なしの 1 文字 (8 ビット) だけだと思っていました。16 だけ左にシフトすると、意味のあるすべてのビットがシフトアウトされ、バイト全体が 0 で埋められませんか? どうやら8ビットではないようです。おそらく、連続した4バイトであるbyteArray全体をシフトしていますか?しかし、それがどのように機能するかわかりません。

4

2 に答える 2

8

その算術コンテキストでは、またはのいずれかにbyteArray[0]プロモートされるため、シフトは合法であり、おそらく賢明です(ビット単位の処理を行う場合は型のみを処理するのが好きです)。intunsigned intunsigned

6.5.7ビット単位のシフト演算子

整数拡張は、各オペランドで実行されます。結果のタイプは、プロモートされた左オペランドのタイプです。

そして整数プロモーション:

6.3.1.1

intが元の型のすべての値を表すことができる場合、値はintに変換されます。それ以外の場合は、unsignedintに変換されます。これらは整数プロモーションと呼ばれます。

于 2012-08-26T15:59:10.127 に答える
2

unsigned char は、シフト時に int に暗黙的にキャストされます。正確にどのタイプにキャストされるかはわかりませんが、プラットフォームとコンパイラに依存します。意図したものを取得するには、バイトを明示的にキャストする方が安全です。これにより、移植性も向上し、読者は何をしようとしているのかをすぐに確認できます。

unsigned long int anotherLongInt;

anotherLongInt = ( ((unsigned long)byteArray[0] << 24) 
               + ((unsigned long)byteArray[1] << 16) 
               + ((unsigned long)byteArray[2] << 8) 
               + ((unsigned long)byteArray[3] ) );
于 2012-08-26T16:03:55.643 に答える