1

谁能解释一下为什么以下内容对我不起作用?

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

using namespace std;

int main()
{
string tempString;
uint64_t tempValue;

cout << "enter addr in hex : ";
cin >> tempString;
istringstream ost(tempString);
ost >> hex >> tempValue;
bitset<64>  addr(tempValue);
cout << "addr = " << addr << endl;
}

只有位集的最低 32 位设置正确。最高位保持为 0。我也尝试使用 unsigned long long 代替 uint64_t。

我正在使用 windows vista 和最近安装的 code::blocks 编辑器。

我尝试将 code::blocks 安装到另一台运行 windows xp 的机器上,但问题是一样的。

编辑2——

我将代码更改为以下

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

using namespace std;

int main()
{
string tempString;
uint64_t tempValue;

cout << "enter addr in hex : ";
cin >> tempString;
istringstream ost(tempString);
if (ost >> hex >> tempValue) cout << "ok" << endl; else cout << "bad" << endl;
ost >> hex >> tempValue;
cout << tempValue << endl;
bitset<64>  addr(tempValue);
cout << "addr = " << addr << endl;
}

现在当我输入时,ffffffffff我得到了输出

ok
1099511627775
addr = 0000000000000000000000000000000011111111111111111111111111111111

谢谢。

4

1 回答 1

0

您正在使用 C++03 编译器。在 C++03 中,bitset构造函数接受一个unsigned long参数,在您的平台上是 32 位,因此您会丢失高位。

在 C++11 中,这已更改为采用unsigned long long,因此您的代码可以正常工作。它也可以在long64 位的平台上工作。

您将需要使用不同的方法将 64 位整数转换为二进制表示字符串或std::bitset,例如遍历所有位的循环。

您还可以分两部分构建位集:

set::bitset<64> bs = (std::bitset<64>(val >> 32) << 32)  | 
                     std::bitset<64>(val & 0xffffffff);
于 2013-08-21T11:30:53.453 回答