C++ C++;否定与超负荷分解
在Microsoft Visual Studio 2015中,以下代码:C++ C++;否定与超负荷分解,c++,integer-promotion,C++,Integer Promotion,在Microsoft Visual Studio 2015中,以下代码: void foo(int8_t a); void foo(int16_t a); void foo(int16_t a, int16_t b); void f() { int8_t x /* = some value */; foo(-int16_t(x)); // ERROR } 给出以下消息: foo Error: more than one instance of overloaded func
void foo(int8_t a);
void foo(int16_t a);
void foo(int16_t a, int16_t b);
void f()
{
int8_t x /* = some value */;
foo(-int16_t(x)); // ERROR
}
给出以下消息:
foo
Error: more than one instance of overloaded function "function" matches the argument list:
function "foo(int8_t a)"
function "foo(int16_t a)"
argument types are: (int)
这是怎么回事?它不应该说“参数类型是:(int16_t)”吗?这和晋升有关系吗?如果是这样的话,我怎样才能关闭升级?在你施放之前先否定。求反提升为机器大小的整数,因此产生歧义
foo(int16_t(-x));
在你施法之前先否定。求反提升为机器大小的整数,因此产生歧义
foo(int16_t(-x));
你忘了整数促销。所有算术运算符对正在进行算术运算的操作数执行整数提升 在表达式
-a
中,对于任何a
,整数提升应用于a
。这样做的效果是,如果a
是比int
窄的整数类型,则该值将提升为int
在您的系统上,int
是32位的,因此int16\u t
更窄,因此-(int16\u t)x
表示-(int)(int16\u t)x
如果你想以16位精度求反:你不能;您必须以int
精度执行此操作,然后将结果转换回16位
在这种情况下,
foo((int16_t)-x)
是最简单的方法,尽管通常要考虑你要否定什么。这里的-x
是-(int)x
,但在这种情况下,这大概就是您想要做的。如果我们使用的是无符号类型,您需要更加小心。您忘记了整数促销。所有算术运算符对正在进行算术运算的操作数执行整数提升
在表达式-a
中,对于任何a
,整数提升应用于a
。这样做的效果是,如果a
是比int
窄的整数类型,则该值将提升为int
在您的系统上,int
是32位的,因此int16\u t
更窄,因此-(int16\u t)x
表示-(int)(int16\u t)x
如果你想以16位精度求反:你不能;您必须以int
精度执行此操作,然后将结果转换回16位
在这种情况下,
foo((int16_t)-x)
是最简单的方法,尽管通常要考虑你要否定什么。这里的-x
是-(int)x
,但在这种情况下,这大概就是您想要做的。如果我们使用的是无符号类型,您需要更加小心。对整数求反将其转换为int
。你到底想要什么样的转换(类型转换和求反)?我不想把“x”符号扩展到一个16位整数,取其2的补码,然后把它传递给foo(int16_t a),我相信在我的计算机上int是32位的,那么为什么16位整数的求反是32位整数呢?在施放之前先求反。否定提升为32位整数。转换为<代码> int >代码>完全符合C++标准。@艾萨克,我相信这与性能有关,在该机器大小的整数中,可以更快地运行。如今,直觉行为可能是一个更大的问题,但我们仍在使用传统行为来实现向后兼容性。对整数求反将其转换为int
。你到底想要什么样的转换(类型转换和求反)?我不想把“x”符号扩展到一个16位整数,取其2的补码,然后把它传递给foo(int16_t a),我相信在我的计算机上int是32位的,那么为什么16位整数的求反是32位整数呢?在施放之前先求反。否定提升为32位整数。转换为<代码> int >代码>完全符合C++标准。@艾萨克,我相信这与性能有关,在该机器大小的整数中,可以更快地运行。如今,直觉行为可能是一个更大的问题,但我们仍然坚持使用遗留行为来实现向后兼容性。