如何修复将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
相关产品推荐
相关产品推荐

