代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

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

  •  2
  • Eli Bendersky  · 技术社区  · 16 年前

    我将带符号的数字(2秒补码)存储在32位整数中,我想从中提取16位字段。如果我从32位有符号数中提取低16位,只要原始(32位)数适合16位,结果就会是正确的,这是真的吗?

    对于正数来说,这是非常正确的,对于负数来说似乎也是如此。但这能被证明吗?

    先谢了

    2 回复  |  直到 16 年前
        1
  •  3
  •   Motti    16 年前

    是的,在二进制补码中,符号位“一直”向左延伸。当你将一个有符号的short转换为有符号的int时,数字是 "sign extended" 并且具有相同的值。

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

    显然,情况正好相反,如果你捕获了至少一个符号位,那么数字的值保持不变。

        2
  •  0
  •   unwind    16 年前

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

    即做这样的事情:

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

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