C++ 使用无符号整数时的无循环

C++ 使用无符号整数时的无循环,c++,C++,我写了一个函数,它必须返回二进制表示中位“1”的n。我观察到了(对我来说)意想不到的行为 当我在for循环中使用unsigned inttype时,函数陷入了一个无休止的循环,我不知道为什么 unsigned int countBits(unsigned long long n) { //your code here int nofbits= log2(n)+1, nofone=0; for(int i=nofbits;i>=0;--i) {

我写了一个函数,它必须返回二进制表示中位“1”的n。我观察到了(对我来说)意想不到的行为

当我在
for
循环中使用
unsigned int
type时,函数陷入了一个无休止的循环,我不知道为什么

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;
}
无止境循环

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;
}
它将始终大于0,因为它是未签名的。无符号数字只能>=0

Remy Lebeau在评论中说,当你从一个无符号的0中减去1时,它将以一个非常大的数字结束:4294967295

它将始终大于0,因为它是未签名的。无符号数字只能>=0


Remy Lebeau在评论中说,当你从一个无符号0中减去1时,它将以一个非常大的数字结束:4294967295

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

,正如类型名称所示,
unsigned int
永远不会变为负值。递减无符号整数值
0
将导致无符号整数值可以具有的最大值。因此,像
i>=0
i
类型为
unsigned int
的比较总是
true

是那些
log2
pow
实际上
std::log2
std::pow
不相关的:整数的幂2最好用左移位处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。那些
log2
pow
实际上是
std::log2
std::pow
吗?不相关:整数2与整数幂的关系最好用左移位处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。
for(unsigned i=nofbits;i>=0;--i)