其他分享
首页 > 其他分享> > 在C中从24位到32位的有符号扩展

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

作者:互联网

我有3个无符号字节分别来自电线.

[byte1, byte2, byte3]

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

我想把字节复制到int32中的高3字节,然后将所有内容移到右边,但我读到这可能有意想不到的行为.

有没有更简单的方法来处理这个?

该表示使用两个补码.

解决方法:

你可以使用:

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

这是因为:

>如果旧符号为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;
}

标签:c,bit-manipulation,bit-shift,sign-extension
来源: https://codeday.me/bug/20191002/1843736.html