在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