为什么将 10 进制数转换为 2 进制数时,位会重复?

Why do bits repeat when I convert a base-10 number into a base-2 number?

我有一个简单的问题。我写了这个小函数,它应该得到一个无符号的 10 进制数,然后以 64 位的二进制表示形式打印它。我注意到我的代码生成的内容中有一个特殊的细节,尽管看起来我没有做错任何事。似乎这些位重复了自己!我尝试打印一个以 10 为基数的“1”,数字是正确的,但是当它到达第 32 位时,我注意到数字重复了!示例:如果我想打印64位二进制表示的1个,那么我应该得到00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001。而是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.发生。哦,亲爱的 Stack Overflow 程序员这是怎么回事!我可以使用你的大脑和知识,非常感谢你。即使您将我指向在线文章,我们也将不胜感激。

    #include <stdio.h>

    void decToBinary(int base_10_number);

    int main(void)
    {
        decToBinary(1);
        return 0;
    }

    /* decToBinary: converts a base 10 number into a base 2 number and prints the result */
    void decToBinary(int base_10_number)
    {
         unsigned short bitmap[64];

        for (int index = 0, pos = 63; index < 64; index++, pos--)
            bitmap[pos] = 1 << index & base_10_number;
    
        for (int control = 0; control < 64; control++)
            printf("%i", bitmap[control]);
    
        putchar('\n');
    }

1 << something 仅适用于 0 到 30 或 31 中的 something。即 32 位 int 数学。

//                               vv----- too big
for (int index = 0, ...; index < 64; index++, ...)
    bitmap[pos] = 1 << index & base_10_number;

除此之外,它是未定义的行为

也许移位仅查看了 something 的 5 个最低有效位。


尝试

for (int index = 0; index < 32; index++)
        bitmap[32 - 1 - index] = ((1u << index) & base_10_number) != 0;

for (int control = 0; control < 32; control++)
        printf("%i", bitmap[control]);