0

次の関数を使用して、バイナリモードで整数を出力したい:

#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を渡した場合、出力が正しくありません。何が問題になっていますか?

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

最上位ビットが0になる原因は何ですか?

4

3 に答える 3

2

この式は、次の場合(つまり、プラットフォーム内)の1 << (i + 1) 未定義の動作です。i + 1 == 32>= CHAR_BIT * sizeof (int)

(C99、6.5.7p3)「右のオペランドの値が負であるか、プロモートされた左のオペランドの幅以上の場合、動作は定義されていません。」

于 2012-06-28T07:56:34.360 に答える
1

呼び出しの式はprintf単純化できます。

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

ちなみに、これもあなたの問題を解決します。

于 2012-06-28T07:58:56.477 に答える
0

他の人が指摘しているように、1> = 32(sizeof(int))ビットだけシフトすると、未定義の動作が発生します。

ビットを印刷する際の複雑さはなぜですか?シンプルな

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

あなたが望むことをします。

于 2012-06-28T08:04:40.443 に答える