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);
    }
}   

主程序

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 回答