次のプログラムを検討してください。
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
と
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
+ 演算子は、返す正しい型をどのように「認識」しますか? 一般的な規則は、すべての引数を最も幅の広い型に変換することですが、ここでは と の間に明確な「勝者」はint
ありませんunsigned int
。最初のケースでは、 の結果が得られるため、 がunsigned int
の結果として選択されている必要があります。2 番目のケースでは、 の結果が得られるため、 を選択しているに違いありません。しかし、一般的なケースでは、これがどのように決定可能かはわかりません。私が見ているこの未定義の動作ですか、それとも何か他のものですか?operator+
2147483648
int
-1