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工作草案,以防措辞(或立场)发生变化。是的,这是我最喜欢的答案。