不使用sizeof()计算int中的位数。

问题描述 投票:0回答:1

我正试图创建一个简单的游戏。任务是创建一个程序,计算int的大小,以bites.他们的代码是。

#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是4bytes,所以我用bitwise操作来移动位,它应该是32,但我得到1。我将感谢你的任何帮助。

c int bit unsigned-integer
1个回答
1
投票

拥有

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

立即停止,所以 i 是不变的,返回值为0。

正确的方法是初始化 x~0u 所有位数都是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
投票

我解决这个问题的方法是在整数的低位放一个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;
}

据我所知,没有担心signedunsigned的问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.