位集和有符号值

Bitset and signed values

我正在使用 std::bitset 将十进制值转换为其二进制表示形式,但我不确定 bitset 是否处理有符号值。

例如,bitset<10>(5) 给你 0000000101。但是如果它 bitset<10>(-5) 呢?

这是我的具体代码:

while (getline(ss, token, ',')){
    ss.ignore();
    myString.push_back(token);
}
myString[0].erase(0, 1);
myString[1].erase(0, 1);
rt = bitset<7>(stoi(myString[0])).to_string();
ra = bitset<7>(stoi(myString[1])).to_string();
i10 = bitset<10>(stoi(myString[2])).to_string();

i10 应该签名。我当前的代码会处理带符号的值吗? myString 将保留用户输入的十进制表示形式,但我需要进行一些连接和写入文件,以便我轻松转换为字符串。

Bitset 将return 二进制表示。由于负数是使用二进制补码存储的,因此您将在二进制补码中获得它们的表示。例如:

cout << bitset<12>(-5).to_string();
// Prints 111111111011

bitset 本身不处理签名。您正在调用的构造函数采用 unsigned 整数。来自 [bitset.cons]:

constexpr bitset(unsigned long long val) noexcept;

Effects: Constructs an object of class bitset<N>, initializing the first M bit positions to the corresponding bit values in val. M is the smaller of N and the number of bits in the value representation (3.9) of unsigned long long. If M < N, the remaining bit positions are initialized to zero.

因此,如果您使用 -5 调用它,它会转换为 unsigned long long,即 0xfffffffffffffffb。它的底部 10 位是 0x3fb,这是你得到的集合。但它是未签名的。两个转换函数都会返回一个无符号值(来自 [bitset.members]):

unsigned long to_ulong() const;
unsigned long long to_ullong() const;

所有这些都是说 - bitset 是一组位。它没有标志。第一点并不特别——只是另一点。

看看std::bitset的构造函数。您会发现,它没有接受有符号整数的构造函数。唯一的积分构造函数是接受 unsigned long.

的构造函数

所以,当你传递一个整数时,它首先被转换为无符号。会发生什么,转换后的值将是一个正值,与带符号的值对无符号类型的最大值取模相同。