一、大整數(shù)類型和一般的整數(shù)類型相比
大整數(shù)類型和一般的整數(shù)類型相比優(yōu)點(diǎn)是不會(huì)溢出,能表示任意長(zhǎng)度的數(shù)字做各種精度的運(yùn)算。
缺點(diǎn)是沒有直接的類型運(yùn)算支持,必須像人類計(jì)算一樣按位數(shù)分別計(jì)算進(jìn)行借位/進(jìn)位操作。。好在現(xiàn)在常用語言比如Java已經(jīng)內(nèi)置大數(shù)庫(kù),不用重復(fù)造輪子了。硬件:不直接支持運(yùn)算,效率低下。現(xiàn)在的主流計(jì)算機(jī)通常都是以寄存器為單位進(jìn)行運(yùn)算,在這種架構(gòu)上實(shí)現(xiàn)大數(shù)運(yùn)算一般都要從內(nèi)存讀取后操作,如果存在大量隨機(jī)讀寫大數(shù)的情況,性能甚至可能下降幾十到上百倍。
普通整數(shù):優(yōu)缺點(diǎn)剛好和大整數(shù)反過來,簡(jiǎn)單快,但是會(huì)存在溢出和精度丟失問題。
為什么不做自動(dòng)類型提升?因?yàn)楹茈y做啊。首先要知道溢出是一個(gè)運(yùn)行時(shí)才能完全確定的問題,那么:對(duì)于類型確定的語言根本做不到,因?yàn)轭愋驮诰幾g期間已經(jīng)確定,除非重新設(shè)計(jì)一個(gè)功能更強(qiáng)大的編譯器。對(duì)于無類型的語言,也許可以通過把所有數(shù)都存在內(nèi)存并且設(shè)置長(zhǎng)度與類型標(biāo)志位的方法來達(dá)到類似的效果,但是這樣程序效率一定會(huì)大大降低,并且解釋器會(huì)變得更復(fù)雜,同時(shí)會(huì)引入一套新的數(shù)據(jù)解析規(guī)則,很多庫(kù)也許都需要重寫。
既然要做無限制的提升,那么數(shù)據(jù)就不能放在寄存器中,同時(shí)還必須設(shè)計(jì)一套能夠在自動(dòng)提升/降低時(shí)能夠自動(dòng)申請(qǐng)/釋放內(nèi)存的方案,同時(shí)還必須兼顧性能……
綜上所述,具備設(shè)計(jì)開發(fā)強(qiáng)于GCC/LLVM等靜態(tài)編譯器,開發(fā)高效解釋語言庫(kù),能完美解決Java的GC問題的人,才能解決這個(gè)問題。
延伸閱讀:
二、大整數(shù)BigInteger
import java.math.BigInteger;
首先,對(duì)于初始化則不像基本類型包裝這塊講著3種方式,這里只剩下valueOf() 可以對(duì)其初始化。
接著,大整數(shù)變量不能使用算術(shù)運(yùn)算符,需要通過以下方法進(jìn)行運(yùn)算:
add():取代了加法運(yùn)算符“+”;
subtract():取代了減法運(yùn)算符“-”;
multiply():取代了乘法運(yùn)算符“*”;
divide():取代了除法運(yùn)算符“/”;
remainder():取代了取余運(yùn)算符“%”;
negate():取代了負(fù)號(hào)運(yùn)算符“-”。