You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复将int与两个short打包入long时的中间值错误?

修复int、short、short打包到long后的还原错误

你的问题出在以下两点:

  • 打包阶段:你将x与0xffff0000L按位与,实际是把x放到了long的中间16位(bits16-31),但还原时却从**高16位(bits48-63)**读取(l >> 48),位置完全错位。
  • short类型的负数(比如x=-567)在Java中会自动提升为int并进行符号扩展(变成32位的负数),直接与0xffff0000L按位与会保留高16位的符号位,导致位值错误。

修正后的完整代码

int p = 123456;
short x = -567;
short y = 789;

// 明确各数据在long中的位分配:p占高32位,x占中间16位,y占低16位
long l = (((long) p) << 32)          // 将int p转成long后左移32位,占bits32-63
        | (((long)(x & 0xffff)) << 16) // 先截断short转int的符号扩展,再左移16位占bits16-31
        | ((long)(y & 0xffff));       // 截断符号扩展后占bits0-15

// 对应位位置还原数据
int p2 = (int) (l >> 32);
short x2 = (short) ((l >> 16) & 0xffff); // 右移16位后截断高位,确保还原short的符号
short y2 = (short) l;

关键逻辑说明

  • 打包x时,x & 0xffff的作用是去掉short转int时自动添加的符号位扩展,只保留原始16位的补码值,再转成long左移16位,准确放到long的中间16位。
  • 还原x时,(l >> 16) & 0xffff先把中间16位移到低16位,再截断高位的符号扩展,最后转成short就能正确恢复负数的符号。

测试结果

运行修正代码后,输出会恢复正常:

p=123456, p2=123456
x=-567, x2=-567
y=789, y2=789

内容的提问来源于stack exchange,提问作者abc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:36:05