C 打印产生奇怪结果的二进制数

C 打印产生奇怪结果的二进制数,c,C,我回顾了按位运算符,并编写了一个简单的代码来打印数字的二进制表示形式,但我有疯狂的输出,对此我没有任何解释。为什么程序没有给我正确的二进制数? 以下是示例输出: 我的代码是: #include <stdio.h> #include <stdlib.h> void pBinary(int x); int main(void) { for (int n = 0; n < 20; n++) { pBinary(n); } ret

我回顾了按位运算符,并编写了一个简单的代码来打印数字的二进制表示形式,但我有疯狂的输出,对此我没有任何解释。为什么程序没有给我正确的二进制数? 以下是示例输出:

我的代码是:

#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');
}
#包括
#包括
无效pBinary(int x);
内部主(空)
{
对于(int n=0;n<20;n++){
pBinary(n);
}
返回0;
}
无效pBinary(整数x)
{
int y=1>=1;
}
putchar('\n');
}

如果
int
的长度为32位,
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');
}
#包括
#包括
无效pBinary(int x);
内部主(空)
{
对于(int n=0;n<20;n++){
pBinary(n);
}
返回0;
}
无效pBinary(整数x)
{
无符号整数y=(1u>=1;
}
putchar('\n');
}

不要发布文本图像!您的代码会调用未定义的行为,请参见标准中的6.5.7。
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');
}
#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');
}