2012-06-28 37 views
0

我想用下面的函數以二進制模式打印的整數倍:如果我通過-1到它以負數作爲參數的print_binary函數有什麼問題?

#include <stdio.h> 

void print_binary(int n) 
{ 
    int i = 0; 

    for (i = sizeof(n)*8 - 1; i >= 0; i--) 
    { 
     printf("%d", ((n & ((1 << (i + 1)) - 1)) >> i) ? 1 : 0); 
    } 
} 

的main.c

int main(int argc, char *argv[]) 
{ 
    printf("%d in binary:\n", atoi(argv[1])); 
    print_binary(atoi(argv[1])); 
    printf("\n"); 

    printf("%d in hex: 0x%x\n", atoi(argv[1]), atoi(argv[1])); 

    return 0; 
} 

,輸出不正確,什麼是錯誤的?

-1 in binary: 
01111111111111111111111111111111 
-1 in hex: 0xffffffff 

是什麼導致最重要的位變成0?

+0

你粘貼的程序,逐字,可能導致[段錯誤](http://ideone.com/lR4wx) –

+0

你應該運行它與參數 –

回答

2

這種表達1 << (i + 1)是未定義行爲時i + 1 == 32(即>= CHAR_BIT * sizeof (int)在你的平臺上。

(C99,6.5.7p3)「如果右操作數的值是負的或大於或等於在促進左操作數的寬度,該行爲是未定義「

+0

我明白了,這真的是一個大問題 –

1

可以簡化您的通話printf的表達:

printf("%d", (n >> i) & 1); 

順便說一句,這也可以解決你的問題。

+0

是的,你是對的 –

0

正如其他人所指出的,將1乘以> = 32(sizeof(int))位將導致未定義的行爲。

爲什麼所有的複雜性,而打印出的位?一個簡單的

for (i = sizeof(n)*8 - 1; i >= 0; i--) 
{ 
    printf("%d", n & (1 << i) ? 1 : 0); 
} 

will do你想要什麼。

+0

不只是'> sizeof(type)',而是實際上'> = sizeof(type)''。 –

+0

@Alex。謝謝。更正! –

+2

另外,爲了便於攜帶,應該使用'CHAR_BIT'而不是8,並且應避免帶符號溢出(例如'1 << sizeof(int)-1')。 –