编写一个C程序,计算无符号整数值的二进制表示中的1的数量(4个字节)

时间:2017-09-16 18:10:58

标签: c binary

我试图编写一个C程序,它将计算用户选择和输入的整数的任何二进制表示中的所有1的数量。然后我要打印总数为1。但首先,我必须检查以确保输入的数字是整数。我的代码:

#include <stdio.h>

int main() {
    int num;
    int count;
    float input;

    printf("Please enter an integer: ");
    scanf("%f", &input);

    num = (int)input;
    if (num == input) {
        while (num > 0) {
            count += num & 1;
            num >>= 1;
            printf("%d", &count);
        }
    } else {
        printf("Warning: this is not a valid integer.");
    }
    return 0;
}

当我运行代码时,我能够输入我选择的整数,但之后我会得到一个输出:134148802013414880201341488020或类似的东西。我最近才开始用C编码,所以我不确定这意味着什么或我的代码出错了。

2 个答案:

答案 0 :(得分:2)

您的代码存在问题:

  • 您不应将该数字读为float,对于大于23位的数字,您的精度会有所下降。
  • count未初始化。即使只是增加它也有不确定的行为。
  • 你应该在循环结束后用printf("%d\n", count);打印位数。您目前使用此类型的无效转化说明符打印count地址

以下是更正后的版本:

#include <stdio.h>

int main(void) {
    unsigned int num;

    printf("Please enter an integer: ");
    if (scanf("%u", &num) == 1) {
        int count = 0;
        while (num > 0) {
            count += num & 1;
            num >>= 1;
        }
        printf("%d\n", count);
    } else {
        printf("Warning: this is not a valid integer\n");
    }
    return 0;
}

注意:

答案 1 :(得分:1)

您的count变量未初始化,因此它可以从随机 1 的任何值开始。始终初始化变量:

int count = 0;

然后当你打印它时,你打印错误的东西 - 一个指向计数而不是计数本身的指针,并且没有回车,所以你把它全部放在一条线上:如果数字是正确的,你会得到一个单期“12345”或“11122234445”。

printf("Count is now is %d\n", count);

我强烈建议你打开来自编译器的所有警告 - 这会警告你一个未初始化的变量,几乎可以肯定的是%d和它之间的差异(也许你错过的事实包括printf

1 反过来说,在某些受控制的开发环境中,内存已归零,您不会看到任何错误。然后你就可以参加制作了。该程序将在性能优化的环境中运行,其中内存清零不值得麻烦。 并且该程序将始终失败。从你开始,你不想养成坏习惯。