Я изучаю перегрузку функции на С++ и натолкнулся на это:
void display(int a)
{
cout << "int" << endl;
}
void display(unsigned a)
{
cout << "unsigned" << endl;
}
int main()
{
int i = -2147483648;
cout << i << endl; //will display -2147483648
display(-2147483648);
}
Из того, что я понял, любое значение, заданное в диапазоне int
(в моем случае int
равно 4 байтам), вызовет display(int)
, и любое значение вне этого диапазона будет неоднозначным (поскольку компилятор не может решить, какая функция звонить). Он действителен для полного диапазона значений int
, за исключением его минимального значения, т.е. -2147483648
, где сбой компиляции с ошибкой
вызов перегруженного
display(long int)
неоднозначен
Но принимая то же значение в int
и печатая значение, получаем 2147483648
. Я буквально путаюсь с этим поведением.
Почему такое поведение наблюдается только тогда, когда передается самое отрицательное число? (Поведение такое же, если a short
используется с -32768
- фактически, в любом случае, когда отрицательное число и положительное число имеют одинаковое двоичное представление)
Используется компилятор: g++ (GCC) 4.8.5