1

質問は基本的なものでなければなりませんが、私は今それを得るのにいくつかの問題があったことに驚いています。最初の1つは、「C++入門書」の本の5.3章を一瞥したときです。ビット単位演算子、作成者がシフト操作を説明するための例として以下のコードを使用する場合:

unsigned char bits = 1;     // '10011011' is the corresponding bit pattern
bits << 1;                  // left shift

これを見ると頭が少し回転しますが、「10011011」はどこから来たのですか?「1」は「0x01」ではありませんか?

別の質問はhttp://c-faq.com/strangeprob/ptralign.htmlから来ています。ここで、作成者は構造を解凍しようとします。

struct mystruct {
    char c;
    long int i32;
    int i16;
} s;

を使用して

unsigned char *p = buf;

s.c = *p++;

s.i32 = (long)*p++ << 24;
s.i32 |= (long)*p++ << 16;
s.i32 |= (unsigned)(*p++ << 8);  // this line !
s.i32 |= *p++;

s.i16 = *p++ << 8;
s.i16 |= *p++;

私の質問は、pはunsigned char(8ビット)へのポインタですよね?s.i32(24〜31、16〜23)の上位バイトを構築する場合、* p++は左シフトを実行する前に'long'(32ビット)に変換されるため、左シフトは* p ++ではビットを失いませんが、

s.i32 |= (unsigned)(*p++ << 8);

* p ++が最初にシフトされ、次にunsigned intに変換されますが、シフト中に* p ++のビットはすべて失われませんか?

ここでも、Cの基本のいくつかが欠けている可能性があることに気付きました。誰かがここで手を差し伸べることを願っています。

ありがとう、

4

2 に答える 2

3

2番目の質問に答えるために、aで算術演算を実行するcharと、(おそらく符号なし)(シフトやその他のビット演算を含む)に昇格するintため、8ビットのchar値ではなく、整数サイズの値がシフトされます。

于 2012-09-24T00:58:15.867 に答える
0

はい、1のビットパターンは0x01です。10011011は、10進数の155のビットパターンです。

シフトに関しては、シフトのような算術演算と二項演算で実行される「積分プロモーション」と呼ばれるものがありません。この場合、unsigned charオペランド(*p++)とintオペランド(定数)があるので、unsigned charオペランドはに変換されintます。キャスト(tolongまたはto )は、昇格とシフトが実行された後unsigned intに常に実行されます。つまり、どのシフトでもすべてのビットが失われることはありません。

于 2012-09-24T01:08:28.357 に答える