从带符号的数字中提取位字段
-
06-07-2019 - |
题
我已经签名存储在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所解释的那样。
不隶属于 StackOverflow