打印二进制数给出奇怪的结果

时间:2016-02-26 00:36:46

标签: c

我正在审查按位运算符,并编写了一个简单的代码来打印数字的二进制表示,但我有疯狂的输出,我没有解释它。为什么程序没有给我正确的二进制数? 以下是示例输出:enter image description here

和我的代码:

#include <stdio.h>
#include <stdlib.h>

void pBinary(int x);

int main(void)
{
    for (int n = 0; n < 20; n++) {
        pBinary(n);
    }
    return 0;
}

void pBinary(int x)
{
    int y = 1 << 31;
    for (int n = 0; n < 32; n++) {
        x & y ? putchar('1') : putchar('0');
        y >>= 1;
    }
    putchar('\n');
}

2 个答案:

答案 0 :(得分:3)

如果int为32位长,1 << 31将调用有符号整数溢出,即未定义行为

考虑使用值来处理无符号。

void pBinary(unsigned int x)
{
    unsigned int y = 1u << 31;
    for (int n = 0; n < 32; n++) {
        x & y ? putchar('1') : putchar('0');
        y >>= 1;
    }
    putchar('\n');
}

使用具有已定义大小的类型更安全。包括inttypes.hstdint.h以使用uint32_t

void pBinary(uint32_t x)
{
    uint32_t = UINT32_C(1) << 31;
    for (int n = 0; n < 32; n++) {
        x & y ? putchar('1') : putchar('0');
        y >>= 1;
    }
    putchar('\n');
}

答案 1 :(得分:1)

在这里你已经移动了数字..31位置。肯定是溢出,因为默认情况下它是通过带符号的数字执行的。

#include <stdio.h>
#include <stdlib.h>

void pBinary(int x);

int main(void)
{
    for (int n = 0; n < 20; n++) {
        pBinary(n);
    }
    return 0;
}

void pBinary(int x)
{
    unsigned int y = (1u << 31); //avoid overflow
    for (int n = 0; n < 32; n++) {
        (x & y) ? putchar('1') : putchar('0');
        y >>= 1;
    }
    putchar('\n');
}