我已经签名存储在32位整数中的数字(2s补码),我想从它们中提取16位字段。如果我从32位有符号数中提取低16位,只要原始(32位)数字适合16位,结果是否正确?
对于正数而言,它是微不足道的,似乎对于负数也是如此。但可以证明吗?
提前致谢
答案 0 :(得分:3)
是的,在二进制补码中,符号位向左延伸“一路”。当您将有符号的短语转换为有符号的int时,该数字为"sign extended"且具有相同的值。
示例:Nibble
(-2) = 1110 => Byte(-2) = 1111_1110
显然,情况恰恰相反,如果您捕获至少一个符号位,则数字的值保持不变。
答案 1 :(得分:0)
从我的(第二)阅读你的问题来看,似乎你不需要“提取”任何比特,而是转换整数?
即。做这样的事情:
int negative = -4711;
short x = (short) negative;
在这种情况下,编译器将确保在赋值中尽可能多地转换原始数字的精度。即使底层硬件没有使用2:s补码,情况也是如此。如果是,那么这可能只是一个截断,正如Motti所解释的那样。