資源描述:
《C語(yǔ)言實(shí)型數(shù)據(jù)的編碼和存儲(chǔ)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、C語(yǔ)言實(shí)型數(shù)據(jù)的編碼和存儲(chǔ)周恒忠(皖西學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系,安徽六安237012)摘要:C語(yǔ)言數(shù)據(jù)類(lèi)型豐富,而數(shù)據(jù)類(lèi)型的確定在程序設(shè)計(jì)中又至關(guān)重要,有必要對(duì)各種類(lèi)型的數(shù)據(jù)進(jìn)行深入細(xì)致的研究。在TurboC2.0中,實(shí)型數(shù)據(jù)包括float型、double型和longdouble型三種,編碼長(zhǎng)度分別為4B、8B和10B,從左至右,第一位為數(shù)據(jù)的符號(hào)位,接下來(lái)為指數(shù)的偏碼,位數(shù)分別為8b、11b和15b,剩余部分為尾數(shù)的編碼。存儲(chǔ)時(shí)以字節(jié)為單位將編碼逆序存放。通過(guò)轉(zhuǎn)換公式可以輕松地實(shí)現(xiàn)數(shù)值與編碼之間的轉(zhuǎn)換,在實(shí)驗(yàn)的基礎(chǔ)上歸納出了實(shí)型數(shù)據(jù)的相關(guān)屬性。關(guān)鍵詞:C語(yǔ)言;實(shí)型;編碼;存
2、儲(chǔ)。1引言數(shù)據(jù)類(lèi)型是程序設(shè)計(jì)語(yǔ)言的重要概念,在各種C語(yǔ)言的相關(guān)資料中,對(duì)于實(shí)型數(shù)據(jù)的介紹不如字符型數(shù)據(jù)和整型數(shù)據(jù)詳細(xì),且說(shuō)法[3][4]不一,甚至存在錯(cuò)誤,特別是其編碼和存儲(chǔ)。筆者經(jīng)過(guò)實(shí)驗(yàn)和研究,歸納出在TurboC2.0環(huán)境中float型、double型和longdouble型三種實(shí)型數(shù)據(jù)的編碼方式和存儲(chǔ)形式,供C語(yǔ)言教學(xué)和程序設(shè)計(jì)時(shí)參考。2實(shí)型數(shù)據(jù)的編碼2.1float型數(shù)據(jù)編碼float型數(shù)據(jù)碼長(zhǎng)四個(gè)字節(jié)32位,四個(gè)字節(jié)分別記為B1,B2,B3和B4,32個(gè)位分別記為b1,b2,…,b32。其中,b1為符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)。b2至b9為指數(shù)的偏碼,偏值為12
3、7。b10~b32-1-2-23為尾數(shù)編碼,分別表示2,2,…,2各位上的數(shù)碼。float型數(shù)據(jù)的編碼方式如下圖所示。符號(hào)位B1B2B3B4指數(shù)(8位偏碼)尾數(shù)(23位)[1][2]float型數(shù)與編碼的關(guān)系由如下公式表示pf=±(1+a)?22-1其中:f為一個(gè)單精度實(shí)型數(shù),一般以十進(jìn)制表示,符號(hào)由首位b1確定,p為指數(shù),其值為8位無(wú)符號(hào)數(shù)與偏值127的差。a為尾數(shù),-1-2-23a=a12+a22+…+a232,其中,ai=0或1(i=1,2,…,23)。利用公式2-1可以實(shí)現(xiàn)數(shù)值與編碼的轉(zhuǎn)換。公式2-1的幾種例外情況:1、指數(shù)編碼全部是1,而尾數(shù)編碼全部為0時(shí),表示±
4、∞;2、指數(shù)編碼全部是1,而尾數(shù)編碼不全為0時(shí),表示一個(gè)無(wú)效數(shù)字;p+13、指數(shù)編碼全部是0,而尾數(shù)編碼不全為0時(shí),f=±a?2;4、所有編碼全部為0時(shí),表示數(shù)0。2.1.1由數(shù)值f確定其編碼先由p的值確定指數(shù)編碼。當(dāng)f≥2時(shí),將f連續(xù)被2除,直到商a滿足2>a≥1,p的值為除法運(yùn)算的次數(shù);當(dāng)f<1時(shí),將f連續(xù)被2乘,直到積a滿足2>a≥1,p的值為負(fù)數(shù),其絕對(duì)值為乘法運(yùn)算的次數(shù)。將無(wú)符號(hào)數(shù)127+p轉(zhuǎn)換為8位二進(jìn)制碼,即為指數(shù)的編碼。-1-23再由a的值確定尾數(shù)編碼。由于a=a12+…+a232,其中1>a≥0。采取乘2取整的方法,分別求出a1,a2,…,a23的值。例如
5、f=100(>2)時(shí),將100連續(xù)被2除6次,商為1.5625,指數(shù)p=6,將133(127+6)轉(zhuǎn)換成8位無(wú)符號(hào)二進(jìn)制數(shù)10000101,即得到了b2至b98個(gè)位的編碼。對(duì)純小數(shù)0.5625采取乘2取整,求得a1=a4=1,a2=a3=a5=…=a23=0,由此,得到b10至b3223個(gè)位的編碼。因?yàn)?00>0,所以,b1=0,故實(shí)型數(shù)100的編碼為:010000101100100000000000000000000再如f=1時(shí),由于1=1.0?2,所以,p=0,a=0,于是ai=0(i=1,2,…,23)。所以實(shí)型數(shù)1編碼為:0011111110000000000000
6、00000000002.1.2由編碼求f的值先根據(jù)編碼分別求出p和a的值,然后利用公式2-1計(jì)算f的值(一般用十進(jìn)制表示)。設(shè)某數(shù)的編碼如下:10111100110010100000000000000000根據(jù)b2至b98個(gè)位的值,求得p=121-127=-6。又因?yàn)閎10、b13、-1-4-6b153個(gè)位的值為1,其余20個(gè)位的值為0,故得a=2+2+2=0.5781,由b1=1知該數(shù)為負(fù)數(shù)。所以,以上編碼表示的實(shí)型數(shù)f為:-6f=-2?1.5781=-0.02456820312。-1-2-23由于2+2+…+2≈1,所以,按如上方式編碼可表示的最大12738float型
7、數(shù)為2?2≈3.40282?10,編碼為:01111111011111111111111111111111當(dāng)指數(shù)編碼全為0時(shí),p=-127,若尾數(shù)編碼不全為0,則公式2-1形p+1-23-126-45如f=a?2,因此,最小正數(shù)為2?2=1.4013?10,其編碼為:00000000000000000000000000000001實(shí)際應(yīng)用時(shí),指數(shù)編碼全部為0的float型數(shù)作為0對(duì)待。所以,-126-38float型最小正數(shù)為2≈1.17549?10。-23-7尾數(shù)最小值為:2≈1.19209?10。float型數(shù)