ฉันกำลังเรียนรู้เกี่ยวกับการทำงานมากเกินไปใน 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)
กำลังมีความคลุมเครือ
แต่การค่าเดียวกันไปยังและการพิมพ์ค่าที่จะช่วยให้int
2147483648
ฉันสับสนกับพฤติกรรมนี้อย่างแท้จริง
เหตุใดจึงสังเกตพฤติกรรมนี้เฉพาะเมื่อมีการส่งผ่านจำนวนลบมากที่สุด (ลักษณะการทำงานจะเหมือนกันหากshort
ใช้กับ-32768
- ในความเป็นจริงไม่ว่าในกรณีใดก็ตามที่จำนวนลบและจำนวนบวกมีการแสดงไบนารีเหมือนกัน)
คอมไพเลอร์ที่ใช้: g ++ (GCC) 4.8.5