C ++中变量的负符号值

时间:2017-07-27 16:49:21

标签: c++

我想将变量与正负幅度中的另一个变量进行比较。

unsigned a =20;
unsigned var = 400;
if( -var < a && a < var )
{
  //true if 20 is greater than (-400) and less than 400
}

我可以像这样比较这两个变量吗?

提前致谢

2 个答案:

答案 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等使用)