写入有符号整数,就好像它在C++中是无符号的一样

Writing to a signed integer as if it is unsigned in C++

本文关键字:无符号 一样 C++ 整数 符号      更新时间:2023-10-16

>这样做reinterpret_cast安全吗,这是最好的方法吗?

例如,在下面的代码中,我有一个名为ibytestream的类,它允许从中读取uint16_ts和int16_tibytestream::next是一个vector<unsigned char>::iterator.

inline ibytestream& operator>>(ibytestream& stream, uint16_t& data) {
data = 0;
data |= *stream.next++;
data <<= 8;
data |= *stream.next++;
return stream;
}
inline ibytestream& operator>>(ibytestream& stream, int16_t& data) {
return stream >> reinterpret_cast<uint16_t&>(data);
}

我不想复制将字节转换为整数的代码,因此我使用签名版本的reinterpret_cast来重用无符号版本中的代码。 它在我的机器上工作正常,但它一般可以在其他现代机器上工作吗?

是的,这是安全的。

标准的三个部分适用于做出此决定:

  1. 有符号和无符号类型的对齐要求相同
  2. 允许在指向具有相同对齐要求的类型的指针之间进行指针转换
  3. 在 gl值之间执行强制转换时,如果相应指针之间的强制转换有效,则强制转换有效。
对于每个标准有符号整数类型

,都存在相应的(但不同的)标准无符号整数类型:unsigned charunsigned short intunsigned intunsigned long int、 和unsigned long long int,每个占用相同的存储量并具有相同的对齐要求。

对象指针可以显式转换为不同类型的对象指针。将类型为"指向 T1 的指针"的 prvalue 转换为"指向 T2 的指针"类型(其中 T1 和 T2 是对象类型,其中 T2 的对齐要求不比 T1 的对齐要求更严格)并返回其原始类型将生成原始指针值。

如果可以使用 reinterpret_cast将">

指向 T1 的指针"类型的表达式显式转换为"指向 T2 的指针"类型,则可以将类型 T1 的 glvalue 表达式强制转换为类型"对 T2 的引用"。结果参考 与源 glvalue 相同的对象,但具有指定的类型。

是的,这应该完全没问题。(在整数和字节数组之间移动有潜在的字节序问题,但这是适用于有符号和无符号数字的另一个问题。

完全不同的东西:这个位:

data = 0;
data |= *stream.next++;

。可以简化:

data = *stream.next++;