繁体   English   中英

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

[英]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作为签名版本来重用未签名版本的代码。 它在我的机器上工作正常,但它会在其他现代机器上运行吗?

是的,这是安全的。

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

  1. 有符号和无符号类型的对齐要求是相同的
  2. 允许在指向具有相同对齐要求的类型的指针之间进行转换
  3. 当执行glvalues之间的强制转换时,如果相应指针之间的强制转换有效,则强制转换有效。

对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型: unsigned charunsigned short intunsigned intunsigned long intunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM