C++ 位集无法处理某些数字
我正在尝试将8字节宽的数字转换为位字符串C++ 位集无法处理某些数字,c++,bitset,C++,Bitset,我正在尝试将8字节宽的数字转换为位字符串 #include <stdio.h> #include <stdlib.h> #include <string> #include <bitset> void getAsString(int64_t mask ) { printf("mask = %lld\n", mask); std::string test = std::bitset< 64 &g
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <bitset>
void getAsString(int64_t mask )
{
printf("mask = %lld\n", mask);
std::string test = std::bitset< 64 >( mask ).to_string();
printf("test = %s \n", test.c_str() );
}
int main()
{
int64_t allowedBits[4] = { 0x0000000000000001L, 0x0000000000010000L, 0x0000000100000000L, 0x0001000000000000L };
for (int i = 0; i < 4; ++i)
{
getAsString(allowedBits[i]);
}
}
这台机器的代码是一样的。
分销商ID:CentOS
说明:CentOS 6.8版(最终版)
发行:6.8
代号:Final
g++(GCC)4.4.7 20120313(红帽4.4.7-17)
给出以下输出
mask = 1
test = 0000000000000000000000000000000000000000000000000000000000000001
mask = 65536
test = 0000000000000000000000000000000000000000000000010000000000000000
mask = 4294967296
test = 0000000000000000000000000000000000000000000000000000000000000000
mask = 281474976710656
test = 0000000000000000000000000000000000000000000000000000000000000000
我已经检查了int64\t的宽度。这两台机器都是8。
对于掩码4294967296和281474976710656,字符串为零
非常感谢您提供的任何帮助。根据您的编译器版本(gcc-4.4.7),代码可能使用了一个未更新的库来处理C++11。
std::bitset
构造函数的前C++11规范使用了一个整数无符号long
。对于32位构建无符号长
使用32位。因此,参数在传递给std::bitset
的构造函数之前将被截断
我验证了gcc-4.4.7附带的
libstdc++
确实使用了unsigned long
作为构造函数中的类型。如果int64\u t
不是8字节,您就会遇到问题。mask
的类型是什么?提示:这意味着按预期提供一个工作。它仍然没有完成。(Complete应该包含类似“intmain(){
”和“}
”的内容)@NiyazK请将其编辑到问题中。它作为一个注释是不可读的。我发现了问题,似乎我用于构建的makefile有标记-m32。在将其更改为-m64后,它工作正常。谢谢你的帮助:)
mask = 1
test = 0000000000000000000000000000000000000000000000000000000000000001
mask = 65536
test = 0000000000000000000000000000000000000000000000010000000000000000
mask = 4294967296
test = 0000000000000000000000000000000000000000000000000000000000000000
mask = 281474976710656
test = 0000000000000000000000000000000000000000000000000000000000000000