在没有 sizeof() 的情况下计算 int 中有多少位

Calculate how much bits is in int without sizeof()

我正在尝试创建简单的游戏。任务是创建程序来计算 int 的大小。 他们的代码是

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = ?;
    while ((?) != 0)
        ?;
    return ?;
}
int main()
{
    printf("Size is %d bits\n",?);
    return 0;
}

?是我应该放置代码的地方。

这是我的一个尝试

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = 0;
    while ((x>>1) != 0)
        i++;
    return i;
}
int main()
{
    printf("Size ise %d bits\n", intSize());
    return 0;
}

我知道 usigned int 是 4 个字节,所以我使用按位运算来移动位,它应该是 32,但我得到的是 1。如果有任何帮助,我将不胜感激。

拥有

x = 0;
while ((x>>1) != 0)
  ...

立即停止,所以i不变,return值为0。

正确的方法是用~0u 初始化 x 使所有位的值为 1(假设 2-补码)

除此之外,测试不正确,您错过了修改 x.

的值

printf("Size ise %d bits\n", intSize);

你错过了 () 来调用函数,目前你尝试写它的地址,我说尝试因为地址必须是 printf 格式 %p.

最后:

#include <stdio.h>

int intSize(void)
{
  unsigned int x,
     i = 0;

  x = ~0u;
  while ((x & 1) != 0)
    (i+= 1, x /= 2); /* not x >= 1 in case it is a rotate rather than a shift */
  return (int) i;
}

int main()
{
    printf("Size is %d bits\n", intSize());
    return 0;
}

编译执行:

pi@raspberrypi:/tmp $ gcc -Wall s.c
pi@raspberrypi:/tmp $ ./a.out
Size is 32 bits
pi@raspberrypi:/tmp $ 

所以为了 '?'是:

  • ~0u
  • x & 1
  • (i+= 1, x /= 2)
  • (int) i

我会通过将 1 放入整数的低位并向 左移 直到它为零来解决这个问题,这意味着该位一直在计时。

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = 1;
    while ((x <<= 1) != 0)
        i++;
    return i+1;
}

int main()
{
    printf("Size is %d bits\n", /*?*/ intSize());
    return 0;
}

据我所知,signed/unsigned 没有任何问题。

EDIT 反映 ?项目的占位符要求。