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

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

和我的代码:

#include  #include  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 >= 1; } putchar('\n'); } 

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

考虑使用值来处理unsigned。

 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 ..31位。 当然是溢出,因为默认情况下它是通过带符号的数字执行的。

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