关于获取机器字的函数的奇怪问题

时间:2011-06-05 15:13:31

标签: c

昨天我写了一个函数来获取C中的机器字,但似乎它有问题。

以下是代码:

unsigned machineword()
{
int i = 1;
unsigned temp;
while (temp > 0)
{
    i++;
    temp = (unsigned)(~0 >> i);
}
return i;
}

3 个答案:

答案 0 :(得分:3)

获取unsigned int宽度的最简单方法是(sizeof(unsigned)*CHAR_BIT)。

编辑:正如pmg所指出的,你应该知道内存中unsigned占用的大小与可用于计算的位数之间的理论差异。您的原始代码会尝试计算后者,下面的程序也是如此。上面的技巧计算了内存中占用的空间。

使用>>计算此数字并不是很方便,因为在C中禁止使用>>,其数字等于或大于您要移动的类型的位数。如果您知道long long严格大于int,则可以通过使用unsigned long long进行计算来解决此问题:

unsigned machineword()
{
  int i = 1;
  unsigned temp=1;
  while (temp > 0)
  {
    i++;
    temp = (unsigned)(((unsigned long long)~(0U)) >> i);
  }
  return i;
}

答案 1 :(得分:1)

在保持结构的同时转移过大值时避免UB的最简单方法是:

unsigned machineword()
{
   unsigned i = 0;
   unsigned temp = ~0U;
   while (temp > 0)
   {
      i++;
      temp >>= 1;
   }
   return i;
}

答案 2 :(得分:1)

要计算位数,您可以使用CHAR_BITUINT_MAX CHAR_BIT方法为您提供每个值在内存中占用的位数 UINT_MAX方法为您提供有效的可用位。

通常两个值都是相同的

#include <limits.h>
#include <stdio.h>

int main(void) {
  unsigned tmp = UINT_MAX;
  int i = 0;
  while (tmp) {
      i++;
      tmp /= 2;
  }
  printf("value bits in a unsigned: %d\n", i);
  printf("memory bits in a unsigned: %d\n", CHAR_BIT * (int)sizeof (unsigned));
  return 0;
}