无法正确打印十进制到二进制数

时间:2016-12-11 02:07:26

标签: c

我正在尝试编写代码来打印数字的二进制表示。这是我的尝试:

#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");
    }
}

这将给出正确的输出。为什么?我的代码与此之间有什么不同。是不是他们用更少的步骤做解决方案做同样的事情?

2 个答案:

答案 0 :(得分:2)

#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 :(得分:0)

您在代码中遇到一些问题:

  • INT_MIN由于带符号的算术溢出而调用未定义的行为。在您的平台上,它很可能产生值temp > 0,它具有预期的位配置但是为负。

  • 如果num < 0
  • temp可能会失败,因为符号位也会使mask为负。

  • 当值为负时将mask向右移动具有实现定义结果:在您的平台上它复制符号位,因此unsigned int将没有预期的单个位,但所有位都设置在当前位之上。这解释了观察到的行为。

您应该在getBinarynumtemp的函数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"); } 类型来获得正确的行为。

以下是您的代码的更正版本:

int

建议的解决方案仅打印16位,这可能是也可能不是规范。如果int类型大于16位,则位移不会溢出,一切都很好。如果1 << 15有16位,void getBinary(unsigned int num) { for (int shift = 32; shift-- > 0;) { putchar('0' + ((num >> shift) & 1)); } putchar("\n"); } 会调用未定义的行为,因此解决方案不是严格正确的,但会在大多数当前平台上运行。

这是一个更简单的解决方案:

shift

16初始化为section.contact form textarea { line-height: 98.5px !important; } ,仅打印低16位。