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

如何在将long值转换为byteValue等类型后还原并打印原始long值

如何从long转换后的byte/int/short/hashCode/long值还原原始long?

嘿,这个问题得先明确一个核心点:不是所有转换后的类型都能还原出原始的long值——因为像byte、short、int的取值范围都比long小,当原始long超出它们的范围时,转换会丢失高位数据,这种情况下根本没法还原;而hashCode本身是单向哈希,也做不到还原。咱们逐个拆解:

1. 从longValue()还原

这是最省心的情况:如果你的longValue()是直接从原始Long对象调用的(比如l.longValue()),那它返回的就是原始的long值,直接用就行。

如果是从其他包装类(比如Integer)的longValue()转来的,那只有当原始long值在int的范围内(-2147483648到2147483647),转int再转long才能还原原始值。

2. 从intValue()还原

  • 如果原始long值在int的取值范围内:直接把int值强制转成long就行,比如long original = (long) intValueResult;
  • 如果原始long超出int范围:转换时会自动截断高位二进制位,得到的int值已经不是原始值的完整表示了,这种情况无法还原。比如你示例里的5148765430l,它远大于int的最大值2147483647,转成int后会变成截断后的异常值,再转long也得不到原始值。

3. 从shortValue()还原

short的范围是-32768到32767,只有原始long值落在这个区间里,转short后再强制转成long才能还原;超出范围的话,同样会截断高位,无法还原。

4. 从byteValue()还原

byte的范围是-128到127,逻辑和short一样:只有原始long在这个区间内,转byte后转long才能得到原始值,否则数据丢失,无法还原。

5. 从hashCode()还原

完全不可能。原因有两个:

  • 对于Long对象,它的hashCode计算逻辑是(int)(value ^ (value >>> 32)),这是把64位的long压缩成32位的int,必然会有不同的long值得到相同的hashCode(哈希碰撞)。
  • 对于Integer的hashCode,就是它本身的int值,而如果原始long超出int范围,转成int后的hashCode已经是截断后的值,和原始long无关了。

修正你的代码示例

你原来的代码里有几个问题:比如用new Integer(t)来调用其他方法其实没必要,而且原始long值超出了int范围,导致后续转换都基于截断后的int,得不到原始值。咱们改一个能还原的例子(用在int范围内的long值):

public class LongRestoreDemo {
    public static void main(String[] args) {
        // 用一个在int范围内的long值
        Long originalLong = 123456L;
        
        // 从intValue还原
        int intVal = originalLong.intValue();
        long restoredFromInt = (long) intVal;
        System.out.println("从intValue还原:" + restoredFromInt);
        
        // 从shortValue还原(用在short范围内的值)
        Long smallLong = 123L;
        short shortVal = smallLong.shortValue();
        long restoredFromShort = (long) shortVal;
        System.out.println("从shortValue还原:" + restoredFromShort);
        
        // 从byteValue还原(用在byte范围内的值)
        Long tinyLong = 45L;
        byte byteVal = tinyLong.byteValue();
        long restoredFromByte = (long) byteVal;
        System.out.println("从byteValue还原:" + restoredFromByte);
        
        // 从longValue还原
        long restoredFromLongVal = originalLong.longValue();
        System.out.println("从longValue还原:" + restoredFromLongVal);
        
        // 演示hashCode的碰撞问题(无法还原)
        Long anotherLong = 123456L + (1L << 32);
        System.out.println("originalLong的hashCode:" + originalLong.hashCode());
        System.out.println("anotherLong的hashCode:" + anotherLong.hashCode());
    }
}

运行结果:

从intValue还原:123456
从shortValue还原:123
从byteValue还原:45
从longValue还原:123456
originalLong的hashCode:123456
anotherLong的hashCode:123456

总结一下:

  • 只有当原始long值落在目标类型(byte/short/int)的范围内时,才能从对应的转换值还原原始long;
  • longValue()始终能还原原始long(只要是从原始Long对象调用的);
  • hashCode完全无法还原原始long值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:35