java signed_如何在Java中执行unsigned to signed转换?

答案取决于输入的低31位代表什么 .

int input = 0x6FD40640 & 0x7FFFFFFF; //strip top bit; only here for clarity

无符号输入: 0x6FD40640 == 1876166208

二进制补码(所需输出:-271317440)

two's complement 整数是-1,其中-1设置了所有位,而较低的负数数字从那里开始倒数 . 第一位仍然作为符号位 .

1000 -> -8

1001 -> -7

...

1110 -> -2

1111 -> -1

0000 -> 0

0001 -> 1

如果低31位代表一个二进制补码整数,那么我认为你应该能够做到这一点:

input = (input << 1) >> 1;

那是因为Java在内部以二进制补码存储整数:我们所做的只是左移然后向右移(签名),以便拾取符号位,整数从31位变为32位 .

一个补码(所需输出:-802424384)

one's complement 数字表示是第一位是专用符号位的表示,其余位表示幅度 . -100的低位与100的低位相同:

1111 -> -7

1110 -> -6

...

1001 -> -1

1000 -> -0 (anomoly)

0000 -> 0

0001 -> 1

如果低31位表示 one's complement 整数(即符号位后跟30位表示无符号幅度),则需要将其转换为二进制补码,以便Java正确提取值 . 要做到这一点,你只需要提取低30位并乘以-1:

if ( input & 0x40000000 ) {

input = (input & 0x3FFFFFFF) * -1;

}

你在问题的评论中说过,转换为度数(除以3600000)后,你得到-75.36左右 . When I divide -271317440 by 3600000 I get -75.36595555555556 ,所以我补充了,所以我的第一个和原始答案是正确的 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值