在C++中从24位到32位的有符号扩展

Bet*_*eto 4 c++ bit-manipulation bit-shift sign-extension

我有3个无符号字节分别来自电线.[byte1,byte2,byte3]

我需要将这些转换为带符号的32位,但我不太确定如何处理负值的签名.

我想把字节复制到int32中的高3字节,然后将所有内容移到右边,但我读到这可能有意想不到的行为.有没有更简单的方法来处理这个?

该表示使用了两个人的赞美.

har*_*old 8

你可以使用:

uint32_t sign_extend_24_32(uint32_t x) {
    const int bits = 24;
    uint32_t m = 1u << (bits - 1);
    return (x ^ m) - m;
}
Run Code Online (Sandbox Code Playgroud)

这是因为:

  • 如果旧符号为1,则XOR使其为零,减法将设置它并借用所有较高位,同时设置它们.
  • 如果旧符号为0,则XOR将设置它,减法再次将其重置并且不借用,因此高位保持为0.

模板版

template<class T>
T sign_extend(T x, const int bits) {
    T m = 1;
    m <<= bits - 1;
    return (x ^ m) - m;
}
Run Code Online (Sandbox Code Playgroud)