2016-02-26 74 views
-1

我正在审查按位运算符,并写了一个简单的代码来打印数字的二进制表示,但我有疯狂的输出,我没有解释它。为什么程序不给我正确的二进制数? 下面是示例输出: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

请勿发布图片的文字!你的代码调用_undefined behaviour_,见标准6.5.7。 – Olaf

回答

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'); 
} 
+0

yikes..gotcha。注意到并纠正了.Thx – coderredoc