关于BigInteger的longValue问题

coinmaster 发布于 08/05 16:29
阅读 254
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

BigInteger v=new BigInteger("1000000000000000000000");
System.out.println(v.longValue());

 

在java下,这段代码为什么执行的结果是:3875820019684212736

没有想明白,盼赐教

加载中
0
K
K
Kendlowski
回复 @coinmaster : 为什么不自己打印看看呢
tcxu
tcxu
回复 @coinmaster : 虽然 长型 可以表示一个很大的整形数字,但也有个限制,即,长型最大值 LONG_Max: 9223372036854775807 你给定的数,超过了这个最大值,则无法表达。
coinmaster
coinmaster
但是 Long.MAX_VALUE 是一个很大的数字,你打印看看,所以我就不明白,照理可以装下
0
tcxu
tcxu

你用 BigInteger 类型 表示的数字:1,000,000,000,000,000,000,000

长型最大值 LONG_Max:                 9,223,372,036,854,775,807

 

虽然 长型 可以表示一个很大的整形数字,但也有个限制,即,长型最大值 LONG_Max: 9223372036854775807

超过这个最大值,则无法表达。

你给出的这个22位数 (1,000,000,000,000,000,000,000),已经超出 长型的最大值,所以无法以长型类型显示。

若将你的这个数,减去三位, 则可以用 长型类型 来表示。

import java.math.*;
public class ValueTest {
    public static void main(String[] args) throws InterruptedException {
    	System.out.println("长型最大值 LONG_Max: " + Long.MAX_VALUE);
		BigInteger v1=new BigInteger("1000000000000000000000");
		System.out.println(v1.longValue());
		BigInteger v2=new BigInteger("1000000000000000000");
		System.out.println(v2.longValue());
    }
}

输出:

长型最大值 LONG_Max: 9223372036854775807
3875820019684212736
1000000000000000000

参考:

保证程序运行整型数据有效

coinmaster
coinmaster
原来是这样,十分感谢你的指导,忘记去计算这个数字的长度了,感谢你的传道受业解惑也
0
tcxu
tcxu

楼主给出的 类 Biginteger 的对象 v 所拥有的整数数值 已经超过 long 所能储存的最大值 (长型最大值 LONG_Max: 9223372036854775807), 就是说, 楼主给出的这个 BigInteger 太大。

根据 JDK1.8 文件中 对于 类 Biginteger 的成员方法 public long longValue()的说明( "将此BigInteger转换为long 。 这种转换类似于The Java™ Language Specification第5.1.3节定义的从long到int的缩小原语转换 :如果这个BigInteger太大而不适合于long ,则只返回低位64位。 请注意,此转换可能会丢失有关BigInteger值的总体大小的信息,并返回具有相反符号的结果。")来判断,  楼主的这个案例,属于"这个BigInteger太大而不适合于long"的案例,因此,"只返回低位64位。"

0
ArchitectureMaster
ArchitectureMaster

你new BigInteger的参数“1000000000000000000000”超出了BigInteger的最大上限。BigInt的长度是4个字也就是8个字节。即 -2*63 到2*63-1次方之间。不要去硬记。这样是记不住的。整型的长度和CPU的位数有关和JVM的位数有关。除非是Int32这样固定就是4个字节或32个bit。否则都是和CPU的处理有关的。32位的处理器也就是x86或 64位处理器x64或amd64。标准的int长度是32位也就是4个字节。而long或bigint的长度是64位或8个字节。

你这里明显的就是因为你输入的字符串超过了2的63次方。因为bigint是有符号的如果是无符号的Unsigned Int64则可容纳更大。所以你这个就算是64次方也超了,LongValue是用最大的值来表示。

 

0
o
oskernel

(1)十进制"1000000000000000000000"对应为70位的二进制"1101100011010111001001101011011100010111011110101000000000000000000000",

(2)long类型只能表示64位,(1)中的二进制与0Xffffffff与操作(取低64位),二级制为"0011010111001001101011011100010111011110101000000000000000000000",对应十进制为3875820019684212736

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部