作者:白杨树 | 来源:互联网 | 2023-01-27 02:01
我正在学习C++中的函数重载,并遇到了这个问题:
void display(int a)
{
cout <<"int" <
根据我的理解,该int
范围内给出的任何值(在我的情况下int
是4个字节)都将调用,display(int)
并且该范围之外的任何值都将是不明确的(因为编译器无法决定调用哪个函数).int
除了最小值之外,它对整个值范围有效,即-2147483648
编译因错误而失败
超载的召唤display(long int)
是模棱两可的
但是将相同的值与a int
打印并给出值2147483648
.我对这种行为感到困惑.
为什么只有在传递最负数时才会观察到这种行为?(该行为是相同的,如果一个short
使用具有-32768
-事实上,在负数和正数具有相同的二进制表示任何情况下)
使用的编译器:g ++(GCC)4.8.5
1> NathanOliver..:
这是一个非常微妙的错误.你所看到的是C++中没有负整数文字的结果.如果我们看[lex.icon],我们得到一个整数字面,
integer-literal
decimal-literal integer-suffix opt
[...]
可以是小数字,
decimal-literal:
非零数字
十进制文字' opt数字
其中数字是[0-9]
和非零位数是[1-9]
和后缀面值可以是一个u
,U
,l
,L
,ll
,或LL
.这里没有任何地方包括-
作为十进制文字的一部分.
在§2.13.2中,我们还有:
的字面整数是不具有周期或指数部分数字序列,条件是确定其值时被忽略可选分离单引号.整数文字可以具有指定其基数的前缀和指定其类型的后缀.数字序列的词汇第一个数字是最重要的.甲十进制整数文字(基10)开始于0以外的位数和由十进制数字序列的.
(强调我的)
这意味着-
in -2147483648
是一元的operator -
.这意味着-2147483648
实际上被视为-1 * (2147483648)
.因为2147483648
它太多了,int
所以它被提升为a long int
,而模糊性来自不匹配.
如果要以便携方式获取类型的最小值或最大值,可以使用:
std::numeric_limits::min(); // or max()
`-2147483647 - 1`也可以在没有警告的情况下作为负面文字表达
或者`INT_MIN`用于最详细的选项.但不太通用.
@infiniteloop十进制整数文字从`int`变为`long int`变为`long long int`.除非使用`u` /`U`后缀,否则你永远不会得到十进制文字的无符号类型.
在这个例子中是的.要调用`display(unsigned a)`你需要`display(1234u);`或`display(static_cast (1234));`或`unsigned foo = 1234; 显示器(FOO);`
2> François And..:
表达式-2147483648
实际上是将-
运算符应用于常量2147483648
.在您的平台上,int
无法存储2147483648
,它必须以更大的类型表示.因此,表达式-2147483648
可能不会被推断为signed int
更大的签名类型signed long int
.
由于您没有为long
编译器提供重载,因此强制在两个同等(有效)的重载之间进行选择.您的编译器应该发出有关模糊重载的编译器错误.