【问题标题】:Endless loop when using unsigned int [duplicate]使用无符号整数时的无限循环[重复]
【发布时间】:2020-06-22 21:09:38
【问题描述】:

我编写了一个函数,它必须以二进制表示形式返回位“1”的 n。我观察到(对我而言)出乎意料的行为。

当我在for 循环中使用unsigned int 类型时,函数会陷入无限循环,我不知道为什么。

unsigned int countBits(unsigned long long n)
{
  //your code here
  int   nofbits=  log2(n)+1,
        nofone=0;
  for(int i=nofbits;i>=0;--i)
  {
      if(n-pow(2,i)>=0)
      {
          nofone++;
          n=n-pow(2,i);
      }
  }
    return nofone;
}

vs 无限循环

unsigned int countBits(unsigned long long n)
{
  //your code here
  int   nofbits=  log2(n)+1,
        nofone=0;
  for(unsigned i=nofbits;i>=0;--i)
  {
      if(n-pow(2,i)>=0)
      {
          nofone++;
          n=n-pow(2,i);
      }
  }
    return nofone;
}

【问题讨论】:

  • 那些log2pow实际上是std::log2std::pow吗?
  • 不相关:整数 2 的整数次幂最好用左移来处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。

标签: c++


【解决方案1】:

正如类型名称所示,unsigned int 永远不会变成负数。递减 unsigned int 值0 会导致 unsigned int 可以采用的最大值。因此,i >= 0i 类型为 unsigned int 的比较将始终为 true

【讨论】:

    【解决方案2】:
    for(unsigned i=nofbits;i>=0;--i)
    

    它总是大于 0,因为它是无符号的。无符号数只能 >= 0。

    来自 cmets,Remy Lebeau 评论说,当你从一个无符号的 0 中减去 1 时,它会环绕你,最终得到一个非常大的数字:4294967295

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2012-02-21
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多