当我运行以下代码时:
class Solution{
public static void main(String []argh){
System.out.println( Long.toHexString( Byte.MIN_VALUE ) );
System.out.println( Long.toHexString( (byte)Math.pow(2,7) );
System.out.println( Long.toHexString( Byte.MAX_VALUE ) );
System.out.println( Long.toHexString( (byte)Math.pow(2,63) -1 ) );
System.out.println();
System.out.println();
System.out.println( Long.toHexString( Short.MIN_VALUE ) );
System.out.println( Long.toHexString( (short)Math.pow(2,15) );
System.out.println( Long.toHexString( Short.MAX_VALUE ) );
System.out.println( Long.toHexString( (short)Math.pow(2,15) -1 ) );
System.out.println();
System.out.println();
System.out.println( Long.toHexString( Integer.MIN_VALUE ) );
System.out.println( Long.toHexString( (-1*(int)Math.pow(2,31)) ) );
System.out.println( Long.toHexString( Integer.MAX_VALUE ) );
System.out.println( Long.toHexString( (int)Math.pow(2,31) -1 ) );
System.out.println();
System.out.println();
System.out.println( Long.toHexString( Long.MIN_VALUE ) );
System.out.println( Long.toHexString( (-1*(long)Math.pow(2,63)) ) );
System.out.println( Long.toHexString( Long.MAX_VALUE ) );
System.out.println( Long.toHexString( (long)Math.pow(2,63) -1 ) );
}
}
我得到以下输出:
ffffffffffffff80
80
7f
fffffffffffffffe
ffffffffffff8000
8000
7fff
ffffffffffff7fff
ffffffff80000000
ffffffff80000001
7fffffff
7ffffffe
8000000000000000
8000000000000001
7fffffffffffffff
7ffffffffffffffe
有人可以解释为什么HexStrings的长度会变化吗?我知道它是基本的,请解释答案。我很困惑。
修改|对不起,我对这个愚蠢的事感到困惑,我没想到。
答案 0 :(得分:3)
因为它不包含前面的零。
例如,Byte.MAX_VALUE
为127,表示为" 7f"。它可以作为" 000000000000007F"返回,但设计师必须决定更多的人在没有初始零的情况下想要它。
您可以看到此行为记录为here。
此值转换为十六进制(基数为16)的ASCII数字字符串,没有额外的前导0 。
强调我的。
在评论中,您似乎对MIN_VALUE
长度如此长的原因感到困惑。要解释此问题,请考虑Byte.MIN_VALUE
和BYTE.MAX_VALUE
。
Byte.MIN_VALUE
为-128,Byte.MAX_VALUE
为127.由于您将这些传递给Long.toHexString
,其中long
为其参数,它们会被上传到{{ 1}}Š。因此,最终转换为十六进制字符串的值是long
值-128和127,使用Two's Complement表示为" ffffffffffffff80"和" 7f"分别