[英]Writing to a signed integer as if it is unsigned in C++
reinterpret_cast
是否安全,这是最好的方法吗?
例如,在下面的代码中,我有一个名为ibytestream
的类,它允许ibytestream
读取uint16_t
s和int16_t
s。 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
作为签名版本来重用未签名版本的代码。 它在我的机器上工作正常,但它会在其他现代机器上运行吗?
是的,这是安全的。
该标准的三个部分适用于做出此决定:
对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型:
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相同的对象,但具有指定的类型。
是的,这应该是完全没问题的。 (在int和字节数组之间移动有潜在的endian-ness问题,但这是另一个适用于有符号和无符号数字的问题。)
完全不同的东西:这一点:
data = 0;
data |= *stream.next++;
......可以简化:
data = *stream.next++;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.