我正在学习用 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