java.math.BigInteger系列教程(八)BigInteger如何存储大数据的?

栏目:Java8基础 作者:admin 日期:2015-01-11 评论:1 点击: 3,241 次

在java的整数类型里面,byte为8位,short为16位,int为32位,long为64位。正因为这些数值的二进制位数已经固定,所以它们能表示的数值大小就有一定的范围限制。如果想表示比这些数值更大的数,怎么办呢?可以使用BigInteger来帮忙。此时我们心里一定会有一个疑问,BigInteger用多少位二进制表示呢?其实,在BigInteger里面使用int数组来存储时间的,如下所示:
final int[] mag;
首先看jdk对mag数组的说明:
The magnitude of this BigInteger, in big-endian order: the zeroth element of this array is the most-significant int of the magnitude. The magnitude must be "minimal" in that the most-significant int (mag[0]) must be non-zero.
这段话告诉我们,int[] mag数组里面,是按照big-endian的顺序存储的。可以看下面的例子:

val是long类型的数据,共有8个字节,high word为前四个字节,存储到mag[0],后四个字节存储到mag[1]里面,从这个源码中我们也可以看出来,long数值要想获得后四个字节,直接转型为int就可以了。
从上面的介绍,我们已经知道了BigInteger的数据存储情况,它里面是通过int数组存放的。这些int数组里的int数值本质上也是通过二进制数位来实现的。int的最大值为:2147483647。也就是mag[]里面可以放入2147483647个int值,每个int值为32位,mag[]可以表示的数组范围为:[-22147483647*32-1 ,22147483647*32-1 -1]

java.math.BigInteger系列教程(八)BigInteger如何存储大数据的?:等您坐沙发呢!

发表评论