c++ - 将 64 位位集转换为二进制字符串表示形式似乎是特定于编译器的失败

标签 c++

这是我的代码:

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

这是结果:00000000000000000000000000000000010101100110100000101111100010101 但这是错误的。

来自评论(和 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++中的相关部分是here :

#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

关于c++ - 将 64 位位集转换为二进制字符串表示形式似乎是特定于编译器的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65288022/

相关文章:

c++ - 来自一维 vector 转置的平均 vector

c++ - 如何从 llvm::Module 生成可执行文件?

c++ - 用于从 cmd 运行参数获取值的库或片段

c++ - "Protobuf compiler version doesn' t 匹配库版本 3.6.1"不使用系统 Protobuf 库时

c++ - 为自定义 std::map 迭代器实现 erase()

c++ - 头文件中的 WX_DECLARE_HASH_MAP

c++ - std::cout::setf 不起作用(setf 为十六进制)

c++ - MFC:在编辑框中表示邻接矩阵

C++ - 设计问题

c++ - 调用实例方法就好像它是静态方法一样