C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解_第1頁(yè)
C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解_第2頁(yè)
C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解_第3頁(yè)
C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解_第4頁(yè)
C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C++中整形與浮點(diǎn)型如何在內(nèi)存中的存儲(chǔ)詳解目錄1數(shù)據(jù)類型1.1類型的基本歸類2整形在內(nèi)存中的存儲(chǔ)2.1二進(jìn)制的三種形式2.2大小端字的介紹3浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)3.1浮點(diǎn)數(shù)存儲(chǔ)規(guī)則

1數(shù)據(jù)類型

前面我們已經(jīng)知道了基本的內(nèi)置類型:

類型的意義:

1.使用這個(gè)類型開辟內(nèi)存空間的大小(大小決定了使用范圍)。

2.如何看待內(nèi)存空間的視角。

1.1類型的基本歸類

整形家族:

char

unsignedchar

signedchar

short

unsignedshort[int]

signedshort[int]

int

unsignedint

signedint

long

unsignedlong[int]

signedlong[int]

char的類型取決于編譯器,在VS編譯器中的char是signedchar.

浮點(diǎn)數(shù)家族:

float

double

其中的float類型精度低,存儲(chǔ)范圍小。

而double類型精度高,存儲(chǔ)范圍大。

構(gòu)造類型:

數(shù)組類型

結(jié)構(gòu)體類型struct

枚舉類型enum

聯(lián)合類型union

指針類型

int*pi;

char*pc;

float*pf;

void*pv;

空類型:

void表示空類型(無(wú)類型)

通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型。

今天我要重點(diǎn)和大家分享的是整形家族和浮點(diǎn)數(shù)家族是如何在內(nèi)存中存儲(chǔ)的。

2整形在內(nèi)存中的存儲(chǔ)

2.1二進(jìn)制的三種形式

原碼:直接用二進(jìn)制表示。

反碼:原碼符號(hào)位不變,其他位按位取反。

補(bǔ)碼:反碼+1。

注意:

1其中正數(shù)的原碼、反碼和補(bǔ)碼相同。負(fù)數(shù)的二進(jìn)制變換規(guī)則如上。

2補(bǔ)碼變?yōu)樵a有二種辦法:

方法1

方法2

那么整形到底是以哪種形式的二進(jìn)制存儲(chǔ)在內(nèi)存中的呢?

實(shí)際是整形是以補(bǔ)碼的形式存儲(chǔ)在內(nèi)存中的。

在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;

同時(shí),加法和減法也可以統(tǒng)一處理(CPU只有加法器)此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過(guò)程是相同的,不需要額外的硬件電路。

這什么是的啥啊

其實(shí)剛剛學(xué)到這里,我也有點(diǎn)懵逼,為什么要用補(bǔ)碼存呢?下面我給大家舉例

1-1這的運(yùn)算結(jié)果是怎么進(jìn)行的呢

1的原碼(在32位平臺(tái)上):00000000000000000000000000000001

-1的原碼(在32位平臺(tái)上):10000000000000000000000000000001

-1的反碼(在32位平臺(tái)上):111111111111111111111111111111111110

-1的補(bǔ)碼(在32位平臺(tái)上):111111111111111111111111111111111111

因?yàn)镃PU只有加法器,所以1-1----1+(-1)

顯然無(wú)論是1的原碼還是反碼和-1的原碼或者補(bǔ)碼相加都得不到結(jié)果。

而補(bǔ)碼確可以100000000000000000000000000000000(這里33),而我們是32位平臺(tái),所以最終結(jié)果為00000000000000000000000000000000(0,看到這里是不是覺的補(bǔ)碼很神奇。所以:整數(shù)在內(nèi)存中存的是補(bǔ)碼。

雖然我們明白內(nèi)存中存的是補(bǔ)碼,但我們還是不知道補(bǔ)碼在內(nèi)存中是怎么存的,下面我們就要說(shuō)到大小端字。

2.2大小端字的介紹

下面我們以整數(shù)1來(lái)理解

大端字節(jié)序存儲(chǔ)

就是把一個(gè)數(shù)據(jù)的高位字節(jié)序的內(nèi)容放在低地址處,低位字節(jié)序的內(nèi)容反在高地址處。

我們用16進(jìn)制表示分布

小端字節(jié)序存儲(chǔ)

就是把一個(gè)數(shù)據(jù)的高位字節(jié)序的內(nèi)容放在高地址處,低位字節(jié)序的內(nèi)容反在低地址處。

下面是在vs中的存儲(chǔ)分布

大小端字節(jié)序的存儲(chǔ)是和硬件有關(guān),有硬件是小端存儲(chǔ),的有是大端存儲(chǔ)。

3浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

很多人多會(huì)想,整形是以補(bǔ)碼的形式存儲(chǔ)在內(nèi)存中,存儲(chǔ)方式于大小端有關(guān),那么浮點(diǎn)型又是怎么存儲(chǔ)的呢?

從上面我們可能看出肯定不是和整形的存儲(chǔ)方式有關(guān)。

3.1浮點(diǎn)數(shù)存儲(chǔ)規(guī)則

根據(jù)國(guó)際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì))754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:

(-1)^S*M*2^E

(-1)^S表示符號(hào)位,當(dāng)S=0,V為正數(shù);當(dāng)S=1,V為負(fù)數(shù)。

M表示有效數(shù)字,大于等于1,小于2。

2^E表示指數(shù)位。

那么1.0就可以寫成

(-1)^0*1.0*2^0(2^n次方是二進(jìn)制的科學(xué)計(jì)算法的形式)

其中二點(diǎn)S=0,M=1.0,E=0

那么9.5我們就可以寫成

(-1)^0*1.0011*2^3

而9.6呢?

我們發(fā)現(xiàn)我們始終都無(wú)法表示出0.6,只能不斷的接近這個(gè)數(shù),所以浮點(diǎn)型在內(nèi)存中的存儲(chǔ)是一個(gè)精確值而不是一個(gè)準(zhǔn)確值。

IEEE754規(guī)定:

對(duì)于32位的浮點(diǎn)數(shù),最高的1位是符號(hào)位s,接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。

對(duì)于64位的浮點(diǎn)數(shù),最高的1位是符號(hào)位S,接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M。

IEEE754對(duì)有效數(shù)字M和指數(shù)E,還有一些特別規(guī)定。

前面說(shuō)過(guò),1M2,也就是說(shuō),M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數(shù)部分。IEEE754規(guī)定,在計(jì)算機(jī)內(nèi)部保存M時(shí),默認(rèn)這個(gè)數(shù)的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的時(shí)候,只保存01,等到讀取的時(shí)候,再把第一位的1加上去。這樣做的目的,是節(jié)省1位有效數(shù)字。以32位浮點(diǎn)數(shù)為例,留給M只有23位,將第一位的1舍去以后,等于可以保存24位有效數(shù)字。

至于指數(shù)E,情況就比較復(fù)雜。

首先,E為一個(gè)無(wú)符號(hào)整數(shù)(unsignedint)

這意味著,如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以IEEE754規(guī)定,存入內(nèi)存時(shí)E的真實(shí)值必須再加上一個(gè)中間數(shù),對(duì)于8位的E,這個(gè)中間數(shù)是127;對(duì)于11位的E,這個(gè)中間數(shù)是1023。比如,2^10的E是10,所以保存成32位浮點(diǎn)數(shù)時(shí),必須保存成10+127=137,即10001001。

指數(shù)E從內(nèi)存中取出還可以再分成三種情況:

E不全為0或不全為1

這時(shí),浮點(diǎn)數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計(jì)算值減去127(或1023),得到真實(shí)值,再將有效數(shù)字M前加上第一位的1。比如:0.5(1/2)的二進(jìn)制形式為0.1,由于規(guī)定正數(shù)部分必須為1,即將小數(shù)點(diǎn)右移1位,則為1.0*2^(-1),其階碼為-1+127=126,表示為01111110,而尾數(shù)1.0去掉整數(shù)部分為0,補(bǔ)齊0到23位00000000000000000000000,則其二進(jìn)制表示形式為:00111111000000000000000000000000

E全為0

這時(shí),浮點(diǎn)數(shù)的指數(shù)E等于1-127(或者1-1023)即為真實(shí)值,有效數(shù)字M不再加上第一位的1,而是還原為0.xx

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論