Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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++ - Fatal编程技术网

C++ C+中变量的负符号值+;

C++ C+中变量的负符号值+;,c++,C++,我想比较一个变量和另一个变量的正负量级 unsigned a =20; unsigned var = 400; if( -var < a && a < var ) { //true if 20 is greater than (-400) and less than 400 } 无符号a=20; 无符号var=400; 如果(-var

我想比较一个变量和另一个变量的正负量级

unsigned a =20;
unsigned var = 400;
if( -var < a && a < var )
{
  //true if 20 is greater than (-400) and less than 400
}
无符号a=20;
无符号var=400;
如果(-var
我可以这样比较这两个变量吗


预先感谢

< P>根据C++标准,

(§5.3.1,一元运算符,8)无符号量的负数通过减去其 2^n中的值,其中n是升级后的数据中的位数 操作数

因此,如果您将
var
声明为
unsignedvar=400
,值
-var
实际上是4294966896(考虑32位表示),示例中的条件
-var
变为(4294966896<20)

如果您试图检查
int
变量(有符号)
a
是否在-400
int a = 20;
unsigned var = 400;
if( static_cast<unsigned>(std::abs(a)) < var )
{
  //true if 20 is greater than (-400) and less than 400
}
inta=20;
无符号var=400;
if(静态(标准::abs(a))
尴尬地问,但在混入未签名的内容时要小心,这是对的

在您的例子中,a和var都是无符号的,因此您的测试应该是如果a小于var,因为您知道not var都不能小于零

在更一般的情况下,使用std::abs()获取绝对值(即符号始终为正的值)并进行比较。。所以如果a和var被签名

if (std::abs(a) < std::abs(var))
if(std::abs(a)
在极端情况下,您可能不得不担心,因为最大的负数不能表示为正数,但如果您接近这些限制,您应该将其转换为双倍(或长对数或长对数等),然后将这些值abs


通常避免使用未签名的字体(尽管使用了有效的大小等)

问题是??当
var
是无符号的时,你期望
-var
是什么?@stark我认为这并不重要,
-var=-1*var
返回值被视为无符号值,有点像当你使用
1.0*var
并返回一个双值时,通常在引用某些内容时提到源代码,即使它是标准的。@molbdnilo编辑,谢谢。我参考了N4618工作草案,以防措辞(或立场)发生变化。是的,这是我最喜欢的答案。