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 intphạm vi (trong trường hợp của tôi intlà 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 intgiá trị ngoại trừ giá trị nhỏ nhất của nó, tức là -2147483648nơ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 intvà 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

