似乎特定于编译器的无法将64位位集转换为二进制字符串表示

这是我的代码:

#include<iostream>
#include<string>
#include<bitset>

using namespace std;

int main()
{
    long long int number;
    number = 123456789123456789;
    string binary = bitset<64>(number).to_string();
    cout<<binary<<"n";
    return 0;
}

结果如下: 000000000000000000000000000000010101100110100000101111100010101 但这是错误的。

来自评论(和 OP 实验)的信息:
相同的代码会在其他环境中产生预期的二进制表示。

是什么原因?

回答

我可以在以下情况下重现该问题:

  • 32位目标架构,
  • 旧的 GCC 版本或针对 C++03 的编译。

例如,对于 GCC 10.2,这种情况发生在-m32 -std=c++03,而在 GCC 4.9.2 中,只有-m32. 在 C++11 之前,unsigned long long标准没有定义。虽然C ++ 98/03实施方式可提供它作为一个非标准扩展,构造的的参数std::bitset是的unsigned long唯一类型。其中,在上述情况下,只有 32 位长。这是您丢失高位的地方。

现场演示:https : //godbolt.org/z/PWdY8K

libstdc++ 中的相关部分在这里:

#if __cplusplus >= 201103L
  constexpr bitset(unsigned long long __val) noexcept
  : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { }
#else
  bitset(unsigned long __val)
  : _Base(__val)
  { _M_do_sanitize(); }
#endif


以上是似乎特定于编译器的无法将64位位集转换为二进制字符串表示的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>