欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:java 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

柚子快報(bào)邀請(qǐng)碼778899分享:java 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

http://yzkb.51969.com/

這里寫(xiě)目錄標(biāo)題

1. 整數(shù)在內(nèi)存中的存儲(chǔ)2. 大小端字節(jié)序和字節(jié)序判斷2.1 什么是大小端?2.2 為什么有大小端?2.3 練習(xí)

3. 浮點(diǎn)數(shù)在內(nèi)存的存儲(chǔ)3.1 浮點(diǎn)數(shù)的存儲(chǔ)3.2浮點(diǎn)數(shù)存的過(guò)程3.3浮點(diǎn)數(shù)取的過(guò)程3.4 題目解析

1. 整數(shù)在內(nèi)存中的存儲(chǔ)

在講解操作符的時(shí)候,我們就講過(guò)了下面的內(nèi)容: 整數(shù)的2進(jìn)制表示放方法有三種,即原碼、反碼和補(bǔ)碼。有符號(hào)的整數(shù),三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,最高位的一位是被當(dāng)做符位,剩余的都是數(shù)值位。 正整數(shù)的原、反、補(bǔ)碼都相同。 負(fù)整數(shù)的三種表示方法各不相同。 原碼:直接將數(shù)值按照正負(fù)數(shù)的形式翻譯成二進(jìn)制得到的就是原碼。反碼:將原碼的符號(hào)位不變,其他位依次按位取反就可以得到反碼。補(bǔ)碼:反碼+1就得到補(bǔ)碼。 對(duì)于整形來(lái)說(shuō):數(shù)據(jù)存放內(nèi)存中其實(shí)存放的是補(bǔ)碼。 為什么呢?在計(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ò)程是相同的,不需要額外的硬件電路。

2. 大小端字節(jié)序和字節(jié)序判斷

當(dāng)我們了解了整數(shù)在內(nèi)存中存儲(chǔ)后,我們調(diào)試看一個(gè)細(xì)節(jié):下面展示一些 內(nèi)聯(lián)代碼片。

#include

int main()

{

int a = 0x11223344;

return 0;

}

調(diào)試的時(shí)候,我們可以看到在a中的 0x11223344 這個(gè)數(shù)字是按照字節(jié)為單位,倒著存儲(chǔ)的。這是為什么呢?這就引出了我們大小端字節(jié)的問(wèn)題了。

2.1 什么是大小端?

其實(shí)超過(guò)一個(gè)字節(jié)的數(shù)據(jù)在內(nèi)存中存儲(chǔ)的時(shí)候,就有存儲(chǔ)順序的問(wèn)題,按照不同的存儲(chǔ)順序,我們分為大端字節(jié)序存儲(chǔ)和小端字節(jié)序存儲(chǔ),下面是具體的概念: 大端(存儲(chǔ))模式: 是指數(shù)據(jù)的低位字節(jié)內(nèi)容保存在內(nèi)存的高地址處,而數(shù)據(jù)的高位字節(jié)內(nèi)容,保存在內(nèi)存的低地址處。 小端(存儲(chǔ))模式: 是指數(shù)據(jù)的高位字節(jié)內(nèi)容保存在內(nèi)存的低地址處,而數(shù)據(jù)的低位字節(jié)內(nèi)容,保存在內(nèi)存的高地址處。 上述概念需要記住,方便分辨大小端。對(duì)于我們剛剛的例子來(lái)講a=0x11223344來(lái)說(shuō),在內(nèi)存中存儲(chǔ)的是44332211,那么這個(gè)就是小端存儲(chǔ)模式,11是數(shù)據(jù)的低字節(jié)內(nèi)容保存在了內(nèi)存的高地址處,所以這個(gè)就是小端存儲(chǔ)模式。

2.2 為什么有大小端?

為什么會(huì)有大小端模式之分呢? 這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit位,但是在C語(yǔ)言中除了8bit的char 之外,還有16bit的short 型,32bit的long 型(要看具體的編譯器),另外,對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如何將多個(gè)字節(jié)安排的問(wèn)題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。 例如:一個(gè)16bit的short 型 x ,在內(nèi)存中的地址為 0x001011, x 的值為 0x1122 ,那么0x11 為高字節(jié), 0x22 為低字節(jié)。對(duì)于大端模式,就將 0x11 放在低地址中,即 0x0010 中,0x22 放在高地址中,即 0x0011 中。小端模式,剛好相反。我們常用的 X86 結(jié)構(gòu)是小端模式,而KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來(lái)選擇是大端模式還是小端模式。

2.3 練習(xí)

請(qǐng)簡(jiǎn)述大端字節(jié)序和小端字節(jié)序的概念,設(shè)計(jì)一個(gè)小程序來(lái)判斷當(dāng)前機(jī)器的字節(jié)序。下面展示一些 內(nèi)聯(lián)代碼片。

int check_sys()

{

int a = 1;

if (*(char*)&a == 1)

{

return 1;//小端

}

else

{

return 0;//大端

}

}

int main()

{

if (check_sys() == 1)

{

printf("?端\n");

}

else

{

printf("?端\n");

}

return 0;

}

首先a=1,內(nèi)存地址就表示為0x00000001,如果是大端存放的話(huà)就是00 00 00 01,如果是小端存放的話(huà)就是01 00 00 00,我們就取地址&a,將其強(qiáng)制類(lèi)型轉(zhuǎn)換成char*類(lèi)型的,這樣就是取出一個(gè)字節(jié),如果是1,就說(shuō)明是小端存放,反之就是大端存放。 下面我們針對(duì)有關(guān)大小端問(wèn)題再來(lái)練習(xí)幾組:下面展示一些 內(nèi)聯(lián)代碼片

#include

int main()

{

char a= -1;

signed char b=-1;

unsigned char c=-1;

printf("a=%d,b=%d,c=%d",a,b,c);

return 0;

}

在沒(méi)有運(yùn)行之前我們可以大膽猜測(cè)一下程序的結(jié)果是什么? 上面就是運(yùn)行結(jié)果,可能我們覺(jué)得c=255這個(gè)結(jié)果很離譜,其實(shí)我們分析下來(lái)還是原因的,首先我們想到char類(lèi)型到底是有符號(hào)的還是無(wú)符號(hào)的呢?對(duì)于大多數(shù)編譯器來(lái)說(shuō)其實(shí)都默認(rèn)是有符號(hào)的,像vs中的char類(lèi)型都是默認(rèn)有符號(hào)的。所以對(duì)于第一個(gè)char a= -1,來(lái)說(shuō)原碼是10000000000000000000000000000001,反碼是11111111111111111111111111111110,補(bǔ)碼11111111111111111111111111111111,但是對(duì)于char類(lèi)型來(lái)說(shuō),只占一個(gè)字節(jié)也就是8個(gè)bit位,所以我們只取后8位也就是11111111,然后再整形提升,對(duì)于-1來(lái)說(shuō),高位補(bǔ)符號(hào)位,也就是11111111111111111111111111111111,所以原碼就是10000000000000000000000000000001,計(jì)算出的結(jié)果就是-1,對(duì)于signed char b也是一樣的,但是對(duì)于無(wú)符號(hào)的c來(lái)說(shuō),我們?nèi)⊥旰?位是11111111,但是對(duì)于無(wú)符號(hào)位的我們要高位補(bǔ)0,00000000000000000000000011111111 然后我們觀(guān)察到我們是以%d來(lái)打印的,而%d打印的是有符號(hào)的整數(shù),所以當(dāng)我們程序看到高位是0的時(shí)候,會(huì)覺(jué)得它是正整數(shù),所以原反補(bǔ)都是一樣的,此時(shí)我們讀出來(lái)的數(shù)正是255

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

常見(jiàn)的浮點(diǎn)數(shù):3.14159、1E10等,浮點(diǎn)數(shù)家族包括: float、double、long double 類(lèi)型。 浮點(diǎn)數(shù)表示的范圍: float.h 中定義。下面展示一些 內(nèi)聯(lián)代碼片。 我們先來(lái)練習(xí)一組,來(lái)看一下輸出的是什么?:

#include

int main()

{

int n = 9;

float* pFloat = (float*)&n;

printf("n的值為:%d\n", n);

printf("*pFloat的值為:%f\n", *pFloat);

*pFloat = 9.0;

printf("num的值為:%d\n", n);

printf("*pFloat的值為:%f\n", *pFloat);

return 0;

}

3.1 浮點(diǎn)數(shù)的存儲(chǔ)

上面的代碼中, num 和 *pFloat 在內(nèi)存中明明是同?個(gè)數(shù),為什么浮點(diǎn)數(shù)和整數(shù)的解讀結(jié)果會(huì)差別這么大? 要理解這個(gè)結(jié)果,一定要搞懂浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部的表示方法。 根據(jù)國(guó)際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì)) 754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式: V = (?1) ? S M ? 2E ? (?1)S 表示符號(hào)位,當(dāng)S=0,V為正數(shù);當(dāng)S=1,V為負(fù)數(shù) ? M 表示有效數(shù)字,M是大于等于1,小于2的 ? 2E 表示指數(shù)位 舉例來(lái)說(shuō): 十進(jìn)制的5.0,寫(xiě)成二進(jìn)制是 101.0 ,相當(dāng)于 1.01×2^2 。 那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。 十進(jìn)制的-5.0,寫(xiě)成二進(jìn)制是 -101.0 ,相當(dāng)于 -1.01×2^2 。那么,S=1,M=1.01,E=2。

IEEE 754規(guī)定: 對(duì)于32位的浮點(diǎn)數(shù),最高的1位存儲(chǔ)符號(hào)位S,接著的8位存儲(chǔ)指數(shù)E,剩下的23位存儲(chǔ)有效數(shù)字M。 對(duì)于64位的浮點(diǎn)數(shù),最高的1位存儲(chǔ)符號(hào)位S,接著的11位存儲(chǔ)指數(shù)E,剩下的52位存儲(chǔ)有效數(shù)字M。

3.2浮點(diǎn)數(shù)存的過(guò)程

IEEE 754 對(duì)有效數(shù)字M和指數(shù)E,還有一些特別規(guī)定。 前面說(shuō)過(guò), 1≤M<2 ,也就是說(shuō),M可以寫(xiě)成 1.xxxxxx 的形式,其中 xxxxxx 表示小數(shù)部分。 IEEE 754 規(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ù)(unsigned int)這意味著,如果E為8位,它的取值范圍為0到255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學(xué)計(jì)數(shù)法中的E是可以出現(xiàn)負(fù)數(shù)的,所以IEEE 754規(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。

3.3浮點(diǎn)數(shù)取的過(guò)程

指數(shù)E從內(nèi)存中取出還可以再分成三種情況: E不全為0或不全為1 這時(shí),浮點(diǎn)數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計(jì)算值減去127(或1023),得到真實(shí)值,再將有效數(shù)字M前加上第?位的1。 比如:0.5 的二進(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)制表示形式為:1 0 01111110 00000000000000000000000 E全為0 這時(shí),浮點(diǎn)數(shù)的指數(shù)E等于1-127(或者1-1023)即為真實(shí)值,有效數(shù)字M不再加上第?位的1,而是還原為0.xxxxxx的小數(shù)。這樣做是為了表示±0,以及接近于0的很小的數(shù)字。 1 0 00000000 00100000000000000000000 E全為1 這時(shí),如果有效數(shù)字M全為0,表示±無(wú)窮大(正負(fù)取決于符號(hào)位s); 1 0 11111111 00010000000000000000000

3.4 題目解析

下面,讓我們回到一開(kāi)始的練習(xí) 先看第1環(huán)節(jié),為什么 9 還原成浮點(diǎn)數(shù),就成了 0.000000 ? 9以整型的形式存儲(chǔ)在內(nèi)存中,得到如下二進(jìn)制序列: 1 0000 0000 0000 0000 0000 0000 0000 1001首先,將 9 的二進(jìn)制序列按照浮點(diǎn)數(shù)的形式拆分,得到第一位符號(hào)位s=0,后面8位的指數(shù)E=00000000 ,最后23位的有效數(shù)字M=000 0000 0000 0000 0000 1001。由于指數(shù)E全為0,所以符合E為全0的情況。因此,浮點(diǎn)數(shù)V就寫(xiě)成: V=(-1)^0 × 0.00000000000000000001001×2(-126)=1.001×2(-146) 顯然,V是?個(gè)很小的接近于0的正數(shù),所以用二進(jìn)制小數(shù)表示就是0.000000。 再看第2環(huán)節(jié),浮點(diǎn)數(shù)9.0,為什么整數(shù)打印是 1091567616,首先,浮點(diǎn)數(shù)9.0 等于?進(jìn)制的1001.0,即換算成科學(xué)計(jì)數(shù)法是:1.001×2^3,所以: 9.0 = (?1)0 ? (1.001) ? 23 那么,第?位的符號(hào)位S=0,有效數(shù)字M等于001后?再加20個(gè)0,湊滿(mǎn)23位,指數(shù)E等于3+127=130,即10000010所以,寫(xiě)成?進(jìn)制形式,應(yīng)該是S+E+M,即1 0 10000010 001 0000 0000 0000 0000 0000這個(gè)32位的?進(jìn)制數(shù),被當(dāng)做整數(shù)來(lái)解析的時(shí)候,就是整數(shù)在內(nèi)存中的補(bǔ)碼,原碼正是1091567616 。

柚子快報(bào)邀請(qǐng)碼778899分享:java 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

http://yzkb.51969.com/

推薦鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀(guān)點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19486020.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪(fǎng)問(wèn)

文章目錄