写入有符号整数,就好像它在C++中是无符号的一样
Writing to a signed integer as if it is unsigned in C++
>这样做reinterpret_cast
安全吗,这是最好的方法吗?
例如,在下面的代码中,我有一个名为ibytestream
的类,它允许从中读取uint16_t
s和int16_t
。ibytestream::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
来重用无符号版本中的代码。 它在我的机器上工作正常,但它一般可以在其他现代机器上工作吗?
是的,这是安全的。
标准的三个部分适用于做出此决定:
- 有符号和无符号类型的对齐要求相同
- 允许在指向具有相同对齐要求的类型的指针之间进行指针转换
- 在 gl值之间执行强制转换时,如果相应指针之间的强制转换有效,则强制转换有效。
,都存在相应的(但不同的)标准无符号整数类型:
unsigned char
、unsigned short int
、unsigned int
、unsigned 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++;
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- C++无符号短裤的划分导致 int
- 写入有符号整数,就好像它在C++中是无符号的一样