Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;否定与超负荷分解_C++_Integer Promotion - Fatal编程技术网

C++ C++;否定与超负荷分解

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

在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 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++标准。@艾萨克,我相信这与性能有关,在该机器大小的整数中,可以更快地运行。如今,直觉行为可能是一个更大的问题,但我们仍然坚持使用遗留行为来实现向后兼容性。