繁体   English   中英

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

[英]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 < 0temp > 0可能会失败,因为符号位也会使temp负。

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

你应该在函数getBinary使用type unsigned int for numtempmask来获得正确的行为。

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

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

初始化shift16以仅打印低位16位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM