C++ プログラムの次の部分を考えてみましょう。コンソールに表示される値はコメントとして提供されます。
{ // case 1
unsigned int x = 10;
unsigned int y = 20;
std::cout << "u/u x - y: " << x-y << std::endl; // 4294967286
}
{ // case 2
int x = 10;
int y = 20;
std::cout << "s/s x - y: " << x-y << std::endl; // -10
}
{ // case 3
unsigned int x = 10;
int y = 20;
std::cout << "u/s x - y: " << x-y << std::endl; // 4294967286
}
{ // case 4
int x = 10;
unsigned int y = 20;
std::cout << "s/u x - y: " << x-y << std::endl; // 4294967286
}
C++ (gcc 4.7.2 で試行) が式から型 (より具体的には、その符号) を定義する方法を理解しようとしています。ケース 1、3、および 4 の場合、通常の算術変換では、両方の値を unsigned int に昇格する必要があります。
10 = b00000000000000000000000000001010
20 = b00000000000000000000000000010100
次に、2 の補数をとって -20 を取得し、それを加算します。
10 = b00000000000000000000000000001010
-20 = b11111111111111111111111111101100
b11111111111111111111111111110110
これを符号なし整数として解釈すると、4294967286 になります。
明らかに、ケース 2 でも同じ計算/結果が得られます。ただし、通常の算術変換では、両方のオペランドが符号付き int として解釈される必要があり、結果も符号付き整数として解釈されるようです。
このことから、オペランドが通常の算術変換の後に署名されている場合、結果は署名されていると推測しています。それ以外の場合、結果は符号なしです。
だから、私の質問は次のとおりです。
- 私の推理は正しいですか?
- 標準はこれをどこで定義していますか? CまたはC++標準でこれへの参照を見つけることができません。
- 他の操作はどうですか?
+
、などは同じように機能すると思い*
ますが、シフトと論理演算はどうですか?
編集:これは(符号付き+符号なし)のC++ 11タイプに関連しているようです? 、しかし、私の質問の重要な部分は、そこで受け入れられた答えから欠落しているようです.通常の算術変換の後、式の結果は常に両方のオペランドの型になりますか?