[英]Write a C program that counts the number of 1s in the binary representation of an unsigned integer value (4 bytes)
我正在尝试编写一个C程序,该程序将计算用户选择和输入的整数的任何二进制表示形式中的所有1。 然后我要打印总数为1s。 但是首先,我必须检查以确保输入的数字是整数。 我的代码:
#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进行编码,所以我不确定这意味着什么或我的代码出了什么问题。
您的代码中有问题:
float
,对于大于23位的数字,您会失去精度。 count
未初始化。 即使只是增加它也具有未定义的行为。 printf("%d\\n", 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;
}
笔记:
UINT_MAX
以下的UINT_MAX
,在当前系统上通常为4294967295
。 较大的数字将以实现定义的方式处理。 您的count
变量未初始化,因此可以从任意值1开始 。 始终初始化变量:
int count = 0;
然后,当您打印它时,您将打印出错误的内容-一个用于计数而不是计数本身的指针,并且没有回车符,因此您可以将所有内容全部在线显示:如果数字正确,则会出现一个问题“ 12345”或“ 11122234445”。
printf("Count is now is %d\n", count);
我强烈建议您打开编译器发出的所有警告 -这会警告您未初始化的变量,几乎可以肯定是%d与提供给它的内容之间的差异(也许您缺少的事实包括对于printf
)
1相反,在某些受控开发环境中,内存为零,您不会看到任何错误。 这样,您就可以将该程序用于生产了。 该程序将在性能优化的环境中运行,在该环境中,内存清零是不值得的麻烦。 然后程序将开始始终失败 。 自开始以来,您就不想养成不良习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.