それはかなり簡単です。シフト演算の結果の型は、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 int
int
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 オペランドのタイプです。
それがあなたの引用が意味するすべてです。