当number被声明为uint32和uint64时,将整数转换为二进制显示不同的输出

时间:2014-04-15 14:16:19

标签: c++ binary uint32 uint64

我试图将整数转换为等效的二进制表示。

我使用以下算法

void decimal_to_binary(uint32_t number)
{
    char bitset[32];
    for(uint32_t i=0; i<32; ++i)
    {
        if((number & (1 << i)) != 0)
        {
            bitset[31-i] = '1';
        }
        else
        {
            bitset[31-i] = '0';
        }
    }
    for(uint32_t i=0; i<32; ++i)                                                                                                               
    {
        cout << bitset[i];
    }
    cout << "\n";
}

当我执行此功能时,例如&#39; 5&#39;声明为uint32_t我得到了正确的结果

decimal_to_binary(5)
00000000000000000000000000000101

但是当我将数字声明为uint64_t并且还将bitset的大小更改为64位时,结果会大不相同

添加代码以执行相同的操作

void decimal_to_binary(uint64_t number)
{
    char bitset[64];
    for(uint64_t i=0; i<64; ++i)
    {
        if((number & (1 << i)) != 0)
        {
            bitset[63-i] = '1';
        }
        else
        {
            bitset[63-i] = '0';
        }
    }
    for(uint64_t i=0; i<64; ++i)
    {
        cout << bitset[i];
    }
    cout << "\n";
}

decimal_to_binary(5)
0000000000000000000000000000010100000000000000000000000000000101

我看到的结果与我在uint32中获得的结果相同,但是将其放在另一个旁边。

这让我想知道如何在CPP这样的编程语言中实现uint64_t?

我试着通过查看stdint头文件来获取更多详细信息,但是那里的链接对我帮助很大。

提前感谢您的时间!!

3 个答案:

答案 0 :(得分:3)

64位代码中的(1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&n

所以1完全被移出。 我不明白这是如何产生你提供的输出的:)

使用1ull作为常量(无符号长long)

答案 1 :(得分:2)

问题出在这一行:

if((number & (1 << i)) != 0)

<<运算符的返回类型是左操作数的类型,在您的实现中显然假定为32位长。将类型移动到比其总位数更多会产生未定义的行为。

要修复它,请使用

if((number & (static_cast<uint64_t>(1) << i)) != 0) 

答案 2 :(得分:2)

如果只有32位数,则移位1超过32位是未定义的行为。未定义的行为意味着它可以做任何事情。正如雷蒙德·陈所说,它可能将右侧操作数限制为31(通过按位和32位)。这就是为什么你得到64位值的下半部分的两个副本。尝试将number向右移动,而不是向左移动1

void decimal_to_binary(uint64_t number)
{
    char bitset[64];
    for(size_t i=0; i<64; ++i)
    {
        if(number & 1) != 0)
        {
            bitset[63-i] = '1';
        }
        else
        {
            bitset[63-i] = '0';
        }
        number >>= 1;
    }
    for(size_t i=0; i<64; ++i)
    {
        cout << bitset[i];
    }
    cout << "\n";
}