位集和有符号值
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
.
的构造函数
所以,当你传递一个整数时,它首先被转换为无符号。会发生什么,转换后的值将是一个正值,与带符号的值对无符号类型的最大值取模相同。
我正在使用 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 firstM
bit positions to the corresponding bit values in val.M
is the smaller ofN
and the number of bits in the value representation (3.9) of unsigned long long. IfM < 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
.
所以,当你传递一个整数时,它首先被转换为无符号。会发生什么,转换后的值将是一个正值,与带符号的值对无符号类型的最大值取模相同。