[英]Trouble printing decimal to binary number properly
我正在尝试编写代码来打印数字的二进制表示。 这是我的尝试:
#include <stdio.h>
void getBinary(int num);
int main(void) {
int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
int mask = 1 << 31, i;
int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
这不起作用。 如果我使num = 2,我的输出将是... 0011。 这是我给出的答案:
void getBinary(int);
int main()
{
int num=0;
printf("Enter an integer number :");
scanf("%d",&num);
printf("\nBinary value of %d is =",num);
getBinary(num);
return 0;
}
/*Function definition : getBinary()*/
void getBinary(int n)
{
int loop;
/*loop=15 , for 16 bits value, 15th bit to 0th bit*/
for(loop=15; loop>=0; loop--)
{
if( (1 << loop) & n)
printf("1");
else
printf("0");
}
}
这将给出正确的输出。 为什么? 我的代码与此之间有什么不同。 是不是他们用更少的步骤做解决方案做同样的事情?
#include <stdio.h>
void getBinary(int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
unsigned int mask = 1 << 31;
int i;
unsigned int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
对于那些好奇的人来说,这是正确的答案。 只需使面具无符号。
您在代码中遇到一些问题:
1 << 31
由于带符号的算术溢出而调用未定义的行为。 在您的平台上,它很可能产生值INT_MIN
,它具有预期的位配置但是为负。
如果num < 0
, temp > 0
可能会失败,因为符号位也会使temp
负。
当其值为负时将mask
移位到右侧具有实现定义结果:在您的平台上它复制符号位,因此mask
不会像预期的那样具有单个位,但是所有位都设置在当前位之上。 这解释了观察到的行为。
你应该在函数getBinary
使用type unsigned int
for num
, temp
和mask
来获得正确的行为。
以下是您的代码的更正版本:
#include <stdio.h>
void getBinary(unsigned int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(unsigned int num) {
unsigned int mask = 1U << 31;
unsigned int temp;
for (int i = 31; i >= 0; i--) {
temp = num & mask;
if (temp != 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
所提出的解决方案仅打印16位,这可能是也可能不是规范。 如果int
类型大于16位,则位移不会溢出,一切都很好。 如果int
有16位,则1 << 15
调用未定义的行为,因此解决方案不是严格正确的,但在大多数当前平台上都能正常工作。
这是一个更简单的解决方案:
void getBinary(unsigned int num) {
for (int shift = 32; shift-- > 0;) {
putchar('0' + ((num >> shift) & 1));
}
putchar("\n");
}
初始化shift
到16
以仅打印低位16位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.