Я изучаю перегрузку функций в C ++ и наткнулся на это:
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)
неоднозначен
Но если взять одно и то же значение для an int
и распечатать его, получится 2147483648
. Меня буквально смущает такое поведение.
Почему такое поведение наблюдается только тогда, когда передается самое отрицательное число? (Поведение такое же, если short
используется с -32768
- фактически, в любом случае, когда отрицательное число и положительное число имеют одинаковое двоичное представление)
Используемый компилятор: g ++ (GCC) 4.8.5