Consider the following programs:
// 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;
}
and
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
How does the + operator “know” which is the correct type to return? The general rule is to convert all of the arguments to the widest type, but here there’s no clear “winner” between int and unsigned int. In the first case, unsigned int must be being chosen as the result of operator+, because I get a result of 2147483648. In the second case, it must be choosing int, because I get a result of -1. Yet I don’t see in the general case how this is decidable. Is this undefined behavior I’m seeing or something else?
This is outlined explicitly in §5/9:
In both of your scenarios, the result of
operator+isunsigned. Consequently, the second scenario is effectively:Because in this case the value of
us + negis not representable byint, the value ofresultis implementation-defined – §4.7/3: