2016-02-26 64 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