Dowiaduję się o przeciążaniu funkcji w C ++ i natknąłem się na to:
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);
}
Z tego, co zrozumiałem, każda wartość podana w int
zakresie (w moim przypadku int
to 4 bajty) zostanie wywołana, display(int)
a każda wartość spoza tego zakresu będzie niejednoznaczna (ponieważ kompilator nie może zdecydować, którą funkcję wywołać). Obowiązuje dla całego zakresu int
wartości z wyjątkiem jego wartości minimalnej, tj. -2147483648
Gdy kompilacja kończy się niepowodzeniem z powodu błędu
wywołanie przeciążenia
display(long int)
jest niejednoznaczne
Ale biorąc tę samą wartość do an int
i wypisując wartość daje 2147483648
. Dosłownie jestem zdezorientowany tym zachowaniem.
Dlaczego to zachowanie jest obserwowane tylko wtedy, gdy zostanie przekazana najbardziej ujemna liczba? (Zachowanie jest takie samo, jeśli a short
jest używane z -32768
- w rzeczywistości w każdym przypadku, gdy liczba ujemna i liczba dodatnia mają tę samą reprezentację binarną)
Używany kompilator: g ++ (GCC) 4.8.5