浮點(diǎn)數(shù)在內(nèi)存是如何存儲(chǔ)的-創(chuàng)新互聯(lián)

IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754)是20世紀(jì)80年代以來最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),為許多CPU與浮點(diǎn)運(yùn)算器所采用。這個(gè)標(biāo)準(zhǔn)定義了表示浮點(diǎn)數(shù)的格式(包括負(fù)零-0)與反常值(denormal number)),一些特殊數(shù)值(無窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點(diǎn)數(shù)運(yùn)算符”;它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時(shí)機(jī)與處理方式)。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、沙灣網(wǎng)站維護(hù)、網(wǎng)站推廣。

IEEE 754規(guī)定了四種表示浮點(diǎn)數(shù)值的方式:?jiǎn)尉_度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實(shí)現(xiàn))。只有32位模式有強(qiáng)制要求,其他都是選擇性的。大部分編程語言都有提供IEEE浮點(diǎn)數(shù)格式與算術(shù),但有些將其列為非必需的。例如,IEEE 754問世之前就有的C語言,有包括IEEE算術(shù),但不算作強(qiáng)制要求(C語言的float通常是指IEEE單精確度,而double是指雙精確度)。

該標(biāo)準(zhǔn)的全稱為IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(ANSI/IEEE Std 754-1985),又稱IEC 60559:1989,微處理器系統(tǒng)的二進(jìn)制浮點(diǎn)數(shù)算術(shù)(本來的編號(hào)是IEC 559:1989)。后來還有“與基數(shù)無關(guān)的浮點(diǎn)數(shù)”的“IEEE 854-1987標(biāo)準(zhǔn)”,有規(guī)定基數(shù)為2跟10的狀況。最新標(biāo)準(zhǔn)是“ISO/IEC/IEEE FDIS 60559:2010”。

這里我們用32位機(jī)器來講述

總體來說,浮點(diǎn)數(shù)我們可以用(-1)* S * M * 2 ^ E 來表示。

其中S表示符號(hào)位,當(dāng)S為0,即正數(shù),S為1即負(fù)數(shù),要注意的是S只有一個(gè)比特位的大小。

M表示有效數(shù)字,他是一個(gè)大于1小于二的數(shù),M的大小就是23個(gè)比特位。

2 ^ E表示指數(shù)位。E是一個(gè)無符號(hào)的整型,大小為8個(gè)比特位。

可以用一個(gè)圖來表示

因?yàn)镋是一個(gè)8bit位的無符號(hào)整數(shù),他的取值范圍就是0-255.但是科學(xué)計(jì)數(shù)法中E可以為負(fù)數(shù)的,

所以在將E存入內(nèi)存時(shí)要加上一個(gè)中間值,8位的中間值是127,所以當(dāng)E存入內(nèi)存前都要加127。

M存入內(nèi)存的有23個(gè)bit位,因?yàn)樗拇笮∈谴笥?小于2的,所以我們存進(jìn)去的值是小數(shù)點(diǎn)后的數(shù),

不存1,這樣我們存的位相當(dāng)于24位,利用的空間更大,當(dāng)取出來時(shí)再加上1即可。

下面我們用5.5為例,解釋一下:

5.5在用二進(jìn)制表示為101.1(其中101表示5,.1表示2的-1次方,也就是二分之一\0.5)

(-1) * 0 * 1.011 * 2 ^ 2? (0表示S,1.011表示M,E表示2)

那么我們將他存入內(nèi)存是怎么樣的呢?

可以看到,5.5是正數(shù),符號(hào)位是0,101.1要變成大于1小于2的數(shù)字,就要向前移動(dòng)兩位,E就是2

再加上127就是129,129的二進(jìn)制就是上圖所示,101.1向前移動(dòng)兩位就是1.011,將小數(shù)點(diǎn)后的數(shù)

存入M,不足23位補(bǔ)0,所以M也就如上圖所示。

再用一個(gè)題來加深印象。

int main()
{
	int a = 9;
	float* pa = &a;
	printf("%d\n", a);
	printf("%f\n", *pa);
	*pa = 9.0f;
	printf("%d\n", a);
	printf("%f\n", *pa);
	return 0;
}

這里可以看到打印的值不一樣,分析一下。

①:a為整型,用%d打印,輸出結(jié)果是9,這個(gè)沒問題。

②:把a(bǔ)的地址取出放入float指針變量pa里,為什么打印出來的是0呢?

9的二進(jìn)制表示就是? ? 00000000000000000000000000001001

我們用浮點(diǎn)數(shù)來取出這個(gè)內(nèi)存,會(huì)認(rèn)為第一位是符號(hào)位,為0,第二到第九位是指數(shù)位,也是0

(有個(gè)知識(shí)點(diǎn):當(dāng)E的值位全0時(shí),表示這個(gè)數(shù)是1.XXXX 乘上2的-128次方,此時(shí)這個(gè)數(shù)是有個(gè)無限接近與0的數(shù),于是標(biāo)準(zhǔn)規(guī)定,M取出時(shí)不再加1,因?yàn)樗呀?jīng)無限接近0了,加不加已經(jīng)沒意義了。當(dāng)E的值為全1時(shí),這個(gè)數(shù)是個(gè)正負(fù)無窮大的數(shù),正號(hào)負(fù)號(hào)由符號(hào)位來決定,因?yàn)?.XXXX乘上2的127次方是一個(gè)很大的數(shù)。)

所以打印出來的結(jié)果就是0.000000;

③:已經(jīng)通過pa解引用將a的值改為9.0,那么再解引用得到9.00000也可以理解。

④:再通過整型來輸出,那么此時(shí)內(nèi)存里的a的二進(jìn)制是0 10000010 00100000000000000000000

我們用整型來輸出,會(huì)認(rèn)為這個(gè)是一個(gè)正數(shù),正數(shù)的原反補(bǔ)碼一樣,就會(huì)將這個(gè)數(shù)直接輸出。

下面我們?cè)偻ㄟ^內(nèi)存來觀察一下。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前名稱:浮點(diǎn)數(shù)在內(nèi)存是如何存儲(chǔ)的-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.muchs.cn/article38/ddsjsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站靜態(tài)網(wǎng)站、建站公司、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)