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

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

提前致谢

有帮助吗?

解决方案

是的,在二进制补码中,符号位“一直”延伸。向左转。当您将签名的短片转换为有符号的int时,该号码为“sign extended”和具有相同的价值。

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

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

其他提示

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

即。做这样的事情:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top