文章也同時(shí)在個(gè)人博客 http://kimihe.com/更新
概覽
本文內(nèi)容是關(guān)于數(shù)字表示,存儲(chǔ)以及運(yùn)算的計(jì)算機(jī)科學(xué)塑荒。
包含了原理速覽以及代碼示例苫亦。
數(shù)的表示
數(shù)在計(jì)算機(jī)中以bit為基本單位俗冻,以0和1兩種狀態(tài)組成二進(jìn)制魄健。通常以8bits組成進(jìn)一步的字節(jié)來(lái)計(jì)算。習(xí)慣上以兩個(gè)16進(jìn)制數(shù)來(lái)表達(dá)一個(gè)字節(jié)旋奢。
與十進(jìn)制一樣泳挥,每一位的二進(jìn)制都有各自的權(quán)重,是一個(gè)二次冪的形式至朗。
整數(shù)分為有符號(hào)與無(wú)符號(hào)兩種屉符,通常以補(bǔ)碼表示。
浮點(diǎn)數(shù)由符號(hào)锹引,尾數(shù)筑煮,階碼構(gòu)成。一般大家可以不用太在意浮點(diǎn)數(shù)的具體原理粤蝎。
數(shù)的存儲(chǔ)
數(shù)字根據(jù)其聲明的類型,占據(jù)對(duì)應(yīng)長(zhǎng)度的位數(shù)袋马,如int32_t站32bits初澎,4個(gè)字節(jié)。平時(shí)存儲(chǔ)于內(nèi)存中虑凛,運(yùn)算時(shí)加載入對(duì)應(yīng)長(zhǎng)度的寄存器碑宴,供CPU使用。
數(shù)的運(yùn)算
由于一個(gè)類型的數(shù)取值范圍有限桑谍,你不能無(wú)限制地進(jìn)行運(yùn)算操作延柠,當(dāng)運(yùn)算結(jié)果超出其值域范圍,便會(huì)產(chǎn)生錯(cuò)誤锣披,從這一點(diǎn)看計(jì)算機(jī)不如人腦“聰明”贞间。
計(jì)算機(jī)對(duì)于數(shù)的理解,完全取決于程序員如何規(guī)定解釋這個(gè)數(shù)字雹仿,如內(nèi)存中有0x30(0011 0000):
- 如果解釋成8位無(wú)符號(hào)數(shù)增热,那它表示48。
- 如果解釋成6位有符號(hào)數(shù)胧辽,那它表示-16峻仇。
- 甚至可以將其理解為表示字符的ascii碼,它表示字符“0”邑商。
此外摄咆,我們想要強(qiáng)調(diào):在C語(yǔ)言這種更接近底層的語(yǔ)言中凡蚜,我們需要時(shí)刻小心數(shù)值存儲(chǔ)及運(yùn)算溢出。
如int32_t長(zhǎng)度下吭从,范圍是:
INT32_MAX: 2147483647
INT32_MIN: -2147483648
雖然數(shù)學(xué)上:2147483647 = (1<<31) - 1= 65536*65536-1
朝蜘,但是計(jì)算機(jī)在計(jì)算的時(shí)候會(huì)產(chǎn)生微妙的問(wèn)題。
根據(jù)int32_t值域影锈,上述三種數(shù)值表達(dá)方式中的6553665536-1會(huì)產(chǎn)生溢出芹务,計(jì)算機(jī)從左往右依次計(jì)算,計(jì)算6553665536時(shí)就會(huì)超過(guò)范圍鸭廷,其運(yùn)算結(jié)果為2的32次方0x1 0000 0000枣抱,超過(guò)最大范圍,于是進(jìn)行數(shù)值截?cái)嗔敬玻『?2位佳晶,其位0x0000 0000,對(duì)應(yīng)補(bǔ)碼解釋為0讼载,于是繼續(xù)運(yùn)算得到最終錯(cuò)誤結(jié)果-1**轿秧。
因此,想要保證結(jié)果正確咨堤,除了使用另外兩種形式書(shū)寫菇篡,也可以考慮調(diào)換數(shù)字位置,如使用65536/2*65536-1
一喘,確保中間值不會(huì)溢出驱还。
另外例子中沒(méi)有使用bool類型,因?yàn)镃沒(méi)有標(biāo)準(zhǔn)bool定義凸克,可以自定義0為false议蟆,!0為true。
代碼
筆者給出了一些測(cè)試代碼萎战,用來(lái)強(qiáng)調(diào)數(shù)的表法范圍和運(yùn)算溢出咐容,代碼的地址如下:https://github.com/kimihe/FUN_IN_CS/tree/master/NumberExpression
進(jìn)一步研究
你可能需要去研究如下知識(shí)點(diǎn):
- 阿貝爾群
- 浮點(diǎn)數(shù)
- 數(shù)的位表示及運(yùn)算
- 布爾代數(shù)
后話
科研其實(shí)還蠻有趣的,一起來(lái)鉆研計(jì)算機(jī)與信息科學(xué)吧蚂维!