0

Mike Banahan による C ブック(セクション 2.8.2.3)からの次の抜粋にある「シフトの結果は、シフトされたものと同じ型を持っています (積分昇格後)」という行を理解できません。

重要なことに、混合型のオペランドを含む規則はシフト演算子には適用されません。シフトの結果は、(積分昇格の後に) シフトされたものと同じ型を持ち、他には何にも依存しません。

何かがすでに整数に昇格されている場合 (シフト演算子の使用中に必要な場合)、それを元の型と同じ型に戻すにはどうすればよいですか? もちろん、それが割り当ての右側にあり、割り当てられている場合を除きます。整数昇格前と同じ型の変数? さらに、「混合型のオペランドを含む規則はシフト演算子には適用されない」という行は正確には何を意味していますか?

質問の両方の部分に光を当ててください。ありがとうございました。

以下は、本からのスクリーンショットで、それぞれビット単位の演算子の使用中および一般的な混合式中のプロモーションに関連しています。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

1

それはかなり簡単です。シフト演算の結果の型は、LHS オペランドの型です。ほとんどの二項演算子では、結果は LHS オペランドと RHS オペランドの両方に基づいていますが、シフト演算子は異なります。

unsigned char      uc = 0x08;
unsigned short     us = 0x0008;
unsigned int       ui = 0x00000008;
unsigned long long ul = 0x0000000000000008;

(私はsizeof(unsigned int) == 4この答えを想定しています。異なる場合は詳細を変更する必要がありますが、概念は変更されていません。)

ここで、いくつかの式を考えてみましょう:

uc + uc;

両方の型が に変換されint、結果はint.

us + us;

繰り返しますが、両方の型が に変換されint、結果は になりintます。

us + ui;
ui + us;

の値usは に変換されunsigned int、結果は次のようになります (以前の値はakaunsigned intに変換されていることに注意してください)。signed intint

ui + ul;
ul + ui;

これらの式は両方とも に変換uiされunsigned long long、結果は になりunsigned long longます。これらの式は対称であることに注意してください。結果の型 (実際、+演算子の場合は結果の値) は、演算子の LHS にある値と RHS にある値に依存しません。

通常の操作については以上です。シフトはどうですか?

uc << uc;

LHS はint通常の算術変換によって に変換され、結果はint.

us << us;

この結果もint.

ui << ui;

この結果はunsigned int.

ul << ul;

この結果はunsigned long long. しかし、タイプを混在させるのはどうですか?

uc << ul;   // Result: int
ul << uc;   // Result: unsigned long long
us << ui;   // Result: int
ui << us;   // Result: unsigned int
ui << ul;   // Result: unsigned int
ul << ui;   // Result: unsigned long long

LHS オペランドのプロモートされた型によって、結果の型が制御されます。より短いタイプの場合int、結果はint; 他のタイプの場合、タイプは LHS オペランドのタイプです。

それがあなたの引用が意味するすべてです。

于 2014-09-21T21:54:18.873 に答える