一、大整数类型和一般的整数类型相比
大整数类型和一般的整数类型相比优点是不会溢出,能表示任意长度的数字做各种精度的运算。
缺点是没有直接的类型运算支持,必须像人类计算一样按位数分别计算进行借位/进位操作。。好在现在常用语言比如Java已经内置大数库,不用重复造轮子了。硬件:不直接支持运算,效率低下。现在的主流计算机通常都是以寄存器为单位进行运算,在这种架构上实现大数运算一般都要从内存读取后操作,如果存在大量随机读写大数的情况,性能甚至可能下降几十到上百倍。
普通整数:优缺点刚好和大整数反过来,简单快,但是会存在溢出和精度丢失问题。
为什么不做自动类型提升?因为很难做啊。首先要知道溢出是一个运行时才能完全确定的问题,那么:对于类型确定的语言根本做不到,因为类型在编译期间已经确定,除非重新设计一个功能更强大的编译器。对于无类型的语言,也许可以通过把所有数都存在内存并且设置长度与类型标志位的方法来达到类似的效果,但是这样程序效率一定会大大降低,并且解释器会变得更复杂,同时会引入一套新的数据解析规则,很多库也许都需要重写。
既然要做无限制的提升,那么数据就不能放在寄存器中,同时还必须设计一套能够在自动提升/降低时能够自动申请/释放内存的方案,同时还必须兼顾性能……
综上所述,具备设计开发强于GCC/LLVM等静态编译器,开发高效解释语言库,能完美解决Java的GC问题的人,才能解决这个问题。
延伸阅读:
二、大整数BigInteger
import java.math.BigInteger;
首先,对于初始化则不像基本类型包装这块讲着3种方式,这里只剩下valueOf() 可以对其初始化。
接着,大整数变量不能使用算术运算符,需要通过以下方法进行运算:
add():取代了加法运算符“+”;
subtract():取代了减法运算符“-”;
multiply():取代了乘法运算符“*”;
divide():取代了除法运算符“/”;
remainder():取代了取余运算符“%”;
negate():取代了负号运算符“-”。