假设我从输入设备读取这些字节:“6F D4 06 40” . 该数字是MilliArcSeconds格式的经度读数 . 顶部位(0x80000000)基本上始终为零,并且在此问题中被忽略 .
我可以轻松地将字节转换为无符号整数:1876166208
但是如何将无符号值转换为31位有符号整数的最终形式?
到目前为止,我所提出的是:
-
if value&0x40000000然后它实际上是负数,需要转换它
-
如果它是负数,则剥离顶部位并对其余位执行某些操作...
所以我可以判断它是否为负数,但为了知道负数是多少,我必须对其余的位做些什么 - 一个人的恭维?我如何用Java做到这一点?
另一种提出问题的方法是,如何在Java中将无符号整数转换为31位有符号整数?
谢谢!
2 回答
答案取决于输入的低31位代表什么 .
无符号输入:
0x6FD40640 == 1876166208
二进制补码(所需输出:-271317440)
two's complement 整数是-1,其中-1设置了所有位,而较低的负数数字从那里开始倒数 . 第一位仍然作为符号位 .
如果低31位代表一个二进制补码整数,那么我认为你应该能够做到这一点:
那是因为Java在内部以二进制补码存储整数:我们所做的只是左移然后向右移(签名),以便拾取符号位,整数从31位变为32位 .
一个补码(所需输出:-802424384)
one's complement 数字表示是第一位是专用符号位的表示,其余位表示幅度 . -100的低位与100的低位相同:
如果低31位表示 one's complement 整数(即符号位后跟30位表示无符号幅度),则需要将其转换为二进制补码,以便Java正确提取值 . 要做到这一点,你只需要提取低30位并乘以-1:
你在问题的评论中说过,转换为度数(除以3600000)后,你得到-75.36左右 . When I divide -271317440 by 3600000 I get -75.36595555555556 ,所以我补充了,所以我的第一个和原始答案是正确的 .
读取无符号整数作为有符号是识别是否设置了最高有效位(负标志)的问题,如果是,则翻转该数字的所有位(从而清除最高有效位,并将数字切换为其负表示 . 在执行上述过程时,您还必须记下结果数字为负数的事实 .