【发布时间】:2020-06-21 17:43:33
【问题描述】:
我对关于无符号到有符号的 C++ 转换规则感到困惑,反之亦然。
我正在从套接字读取数据并将其保存在std::vector<uint8_t> 中。然后我需要阅读其中的一部分
(假设它是 ASCII 数据)并将其保存在 std::string 中。这就是我正在做的:
for (std::vector<uint8_t>::const_iterator it = payload.begin() + start; it < payload.begin() + end; ++it) {
store_name.push_back(*it);
}
如您所见,*it 返回一个uint8_t 并将其传递给std::string 的push_back 成员函数,该函数接受char - 因此发生了隐式转换。 char 实际上可能是已签名或未签名的。我不确定如果它被签名会发生什么。
我无法理解(没有双关语)这里发生的事情,以及它是否安全。
store_name.push_back(*it) 在将*it 存储到std::string 之前是否会更改其位模式?
究竟有哪些规则来管理这一点?
我已经在网上浏览了很多地方来解释类型转换规则,但它仍然不适合我。解释将不胜感激。
编辑:换一种说法 - 一般来说,当我们将 unsigned 转换为 signed 或反之亦然时会发生什么?
unsigned char a = 50; // Inside the range of signed char
signed char b = (signed char) a;
b 中的位模式是否需要与a 中的位模式相同?或者位模式会改变吗?
还有,相反的方向呢:
a = (unsigned char) b;
再次 - 位模式是否发生变化?还是保证底层位模式保持不变,无论我们进行多少次有符号-无符号转换,只要值在正确的范围内?
如果它是使用(cstyle cast) 或static_cast<> 的显式转换,还是通过赋值隐式转换,这有关系吗?
【问题讨论】:
-
我相信 C++20 保证二进制补码,因此行为得到保证。虽然我还没有看到不安全的编译器/架构(在实践中,如果不是标准的话)
标签: c++ type-conversion