似乎特定于编译器的无法将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