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

时间:2016-12-23 08:11:52

标签: c++ reinterpret-cast

reinterpret_cast是否安全,这是最好的方法吗?

例如,在下面的代码中,我有一个名为ibytestream的类,它允许从中读取uint16_tint16_t s。 ibytestream::nextvector<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作为签名版本来重用未签名版本的代码。它在我的机器上工作正常,但它会在其他现代机器上运行吗?

2 个答案:

答案 0 :(得分:3)

是的,这是安全的。

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

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

    对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型: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相同的对象,但具有指定的类型。

答案 1 :(得分:1)

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

完全不同的东西:这一点:

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

...可以简化:

data = *stream.next++;