Tôi đang tìm hiểu về nạp chồng hàm trong C ++ và bắt gặp điều này:
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);
}
Theo những gì tôi hiểu, bất kỳ giá trị nào được cho trong int
phạm vi (trong trường hợp của tôi int
là 4 byte) sẽ gọi display(int)
và bất kỳ giá trị nào ngoài phạm vi này sẽ không rõ ràng (vì trình biên dịch không thể quyết định gọi hàm nào). Nó hợp lệ cho toàn bộ phạm vi int
giá trị ngoại trừ giá trị nhỏ nhất của nó, tức là -2147483648
nơi biên dịch không thành công với lỗi
cuộc gọi quá tải
display(long int)
là mơ hồ
Nhưng lấy cùng một giá trị cho một int
và in ra giá trị đó 2147483648
. Tôi thực sự bối rối với hành vi này.
Tại sao hành vi này chỉ được quan sát khi vượt qua số âm nhất? (Hành vi giống nhau nếu a short
được sử dụng với -32768
- trên thực tế, trong mọi trường hợp khi số âm và số dương có cùng một biểu diễn nhị phân)
Trình biên dịch được sử dụng: g ++ (GCC) 4.8.5