从带符号的数字中提取位字段

时间:2008-11-03 08:29:33

标签: binary bit-manipulation math signed

我已经签名存储在32位整数中的数字(2s补码),我想从它们中提取16位字段。如果我从32位有符号数中提取低16位,只要原始(32位)数字适合16位,结果是否正确?

对于正数而言,它是微不足道的,似乎对于负数也是如此。但可以证明吗?

提前致谢

2 个答案:

答案 0 :(得分:3)

是的,在二进制补码中,符号位向左延伸“一路”。当您将有符号的短语转换为有符号的int时,该数字为"sign extended"且具有相同的值。

示例:Nibble (-2) = 1110 => Byte(-2) = 1111_1110

显然,情况恰恰相反,如果您捕获至少一个符号位,则数字的值保持不变。

答案 1 :(得分:0)

从我的(第二)阅读你的问题来看,似乎你不需要“提取”任何比特,而是转换整数?

即。做这样的事情:

int negative = -4711;
short x = (short) negative;

在这种情况下,编译器将确保在赋值中尽可能多地转换原始数字的精度。即使底层硬件没有使用2:s补码,情况也是如此。如果是,那么这可能只是一个截断,正如Motti所解释的那样。