【问题标题】:Calculate how much bits is in int without sizeof()在没有 sizeof() 的情况下计算 int 中有多少位
【发布时间】:2020-04-29 19:16:45
【问题描述】:

我正在尝试创建简单的游戏。任务是创建计算 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。我会感谢任何帮助。

【问题讨论】:

  • 用 0 初始化 x while ((x&gt;&gt;1) != 0) 如果立即为假,则正确的值为 -1,而你错过了函数调用中的 ()
  • 是的,谢谢,这是我忘记调用函数的一个问题。固定的。但是值 1 或 -1 我仍然只得到一个结果。
  • 问题陈述有缺陷,这应该报告给分配问题的老师。模板代码使用unsigned,但不能保证计算unsigned 中用于表示值的位数会为int 生成正确的结果,因为C 标准不要求int 使用相同数量的位为unsigned;可能有填充位。如果包含&lt;limits.h&gt;,则可以将x初始化为INT_MAX,然后可以计算位数。否则,由于溢出,无法以定义的方式探测int 的宽度。

标签: c int bit unsigned-integer


【解决方案1】:

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

while立即停止,所以i不变,返回值为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 &amp; 1
  • (i+= 1, x /= 2)
  • (int) i

【讨论】:

  • 不知道为什么,结果是0。
  • @JurajJakubov 如果您调用该函数,则为 0,但其余部分不变,正如我在回答中所说,while 永远不会执行,因此 i 值为 0
  • 但我只能更改“?”我不能完全重新制作而条件。
  • @JurajJakubov 我编辑了,所以我使用人工但有效的表格(i+= 1, x /= 2) 来表示?作为while的主体
  • 谢谢你,这就是我正在寻找的 :)
【解决方案2】:

我会通过将 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;
}

据我所知,无需担心已签名/未签名。

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

【讨论】:

  • 感谢演示。但我只能改变“?”所在的地方。
  • 编辑以反映这一点。
  • 这是未定义的行为:wiki.sei.cmu.edu/confluence/display/c/…
  • 这不是未定义的行为。他移动了1 位。 1 远低于 int 中的位数。
  • @KamilCuk 答案已编辑,是signed int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多