我想将变量与正负幅度中的另一个变量进行比较。
unsigned a =20;
unsigned var = 400;
if( -var < a && a < var )
{
//true if 20 is greater than (-400) and less than 400
}
我可以像这样比较这两个变量吗?
提前致谢
答案 0 :(得分:4)
根据C ++标准,
(§5.3.1,一元运算符,8 )无符号数量的负数通过减去其来计算 值来自2 ^ n,其中n是提升的位数 操作数。
因此,如果您将var
声明为unsigned var = 400;
,则值-var
实际上是 4294966896 (考虑到32位表示)和条件{{1}在你的例子中成为(4294966896&lt; 20)。
如果您要检查-var < a
变量(已签名)int
是否在-400&lt; 1之间? a&lt; 400你可以这样做:
a
答案 1 :(得分:0)
尴尬地问道,但是当你在那里没有签名时,你要小心谨慎。
在你的情况下,a和var都是无符号的,所以你的测试应该只是a如果a小于var,因为你知道并非var不能小于零。
在更一般的情况下,使用std :: abs()获取绝对值(即符号始终为正值的值)并比较..所以如果a和var已签名..
if (std::abs(a) < std::abs(var))
在极端情况下,您可能不得不担心,因为最大的负数不能表示为正数,但如果您在任何接近这些限制的地方,您应该转换为双倍(或长或长日志等)然后绝对那些价值。
并且通常避免使用unsigned(尽管有效size_t等使用)