国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式

這篇具有很好參考價(jià)值的文章主要介紹了C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

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

關(guān)于整數(shù)在內(nèi)存中的存儲(chǔ)形式,在博主之前寫的文章里已經(jīng)介紹了!友友們可以去點(diǎn)下面鏈接去看,這里就不過多介紹。

C語言:進(jìn)制的轉(zhuǎn)換以及原碼、反碼、補(bǔ)碼

我們以整型在內(nèi)存中的存儲(chǔ)形式為基礎(chǔ),探究后面的內(nèi)容:整型提升與截?cái)唷⑺銛?shù)轉(zhuǎn)換、大小端字節(jié)序和字節(jié)序判斷、強(qiáng)制類型轉(zhuǎn)換的原理、浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)??!

二、整型提升與截?cái)?/h2>

C語?中,整型算術(shù)運(yùn)算總是?少以缺省(缺省就是默認(rèn)的意思)整型類型的精度來進(jìn)?的。

為了獲得這個(gè)精度,表達(dá)式中的字符和短整型操作數(shù)在使?之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換稱為整型提升。

2.1 整型提升的意義

? ? ? 表達(dá)式的整型運(yùn)算要在CPU的相應(yīng)運(yùn)算器件內(nèi)執(zhí)?,CPU內(nèi)整型運(yùn)算器(ALU)的操作數(shù)的字節(jié)?度? 般就是int的字節(jié)?度,同時(shí)也是CPU的通?寄存器的?度。

? ? ?因此,即使兩個(gè)char類型的相加,在CPU執(zhí)?時(shí)實(shí)際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)?度。

? ? ?通?CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個(gè)8?特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令中 可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種?度可能?于int?度的整型值,都必須先轉(zhuǎn)換為 int或unsigned int,然后才能送?CPU去執(zhí)?運(yùn)算。

? ? ? 也就是說,假設(shè)c1和c2是char類型,那么要先將要實(shí)現(xiàn)c1+c2,就需要對(duì)c1和c1進(jìn)行整型提升之后進(jìn)行運(yùn)算,那么假設(shè)我們用char類型的c3去接收c1和c2的結(jié)果,由于char類型是一個(gè)字節(jié),所以會(huì)發(fā)生截?cái)唷?/strong>截?cái)嘀?,只?huì)保留低位的字節(jié)存儲(chǔ)在c3中??!

?2.2 如何進(jìn)行整體提升呢?

1. 有符號(hào)整數(shù)提升是按照變量的數(shù)據(jù)類型的符號(hào)位來提升的

2. ?符號(hào)整數(shù)提升,?位補(bǔ)0

2.3 如何進(jìn)行截?cái)嗄兀?/h3>

當(dāng)長字節(jié)的數(shù)據(jù)類型用短字節(jié)的數(shù)據(jù)類型進(jìn)行存儲(chǔ)時(shí),會(huì)發(fā)生截?cái)啵?strong>截?cái)?/strong>就是通過簡單地將高位丟棄,保存低位來實(shí)現(xiàn)

補(bǔ)充一條知識(shí):

C語言規(guī)定,char類型默認(rèn)是否帶有正負(fù)號(hào),由當(dāng)前的系統(tǒng)決定,也就是說char類型可能等價(jià)于signed char也可能等價(jià)于unsigned char,這一點(diǎn)與int不同,int必然等價(jià)于signed int,但是在大多數(shù)的編譯器環(huán)境下,包括當(dāng)前的vs,char等價(jià)于signed char!

下面我將通過一道例題來深入解析整型提升和截?cái)嗟娜^程?。?!

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

?大家可以看我的注釋,寫的比較詳細(xì)!? ?

? ? ? 我們會(huì)發(fā)現(xiàn),當(dāng)char類型進(jìn)行運(yùn)算時(shí),會(huì)進(jìn)行整型提升,而當(dāng)計(jì)算的結(jié)果保存在char類型時(shí),會(huì)對(duì)整型提升后的結(jié)果進(jìn)行截?cái)?,只保留低位?/span>

三、算數(shù)轉(zhuǎn)換??

? ? ? 明白了整型提升與截?cái)?,我們考慮到了計(jì)算字符和短整型操作數(shù)使用前的情況,那如果操作數(shù)類型都大于等于4個(gè)字節(jié)呢???

? ? ?如果某個(gè)操作符的各個(gè)操作數(shù)屬于不同的類型,那么除非其中一個(gè)操作數(shù)轉(zhuǎn)換為另一個(gè)操作數(shù)的類型,否則操作將無法進(jìn)行。那么為了判別兩個(gè)操作數(shù)轉(zhuǎn)換的優(yōu)先級(jí),設(shè)置了如下層次體系,該體系杯成為尋常算數(shù)轉(zhuǎn)換。

long double
double
float
unsigned long int
long int
unsigned int
int

? ? ? 類型排名較低的操作數(shù)應(yīng)該轉(zhuǎn)換成類型排名高的操作數(shù)進(jìn)行計(jì)算

比方說float a+int b,那計(jì)算前會(huì)先把b轉(zhuǎn)換成float類型運(yùn)算

如果是float a +double b,那計(jì)算前會(huì)先把a(bǔ)轉(zhuǎn)換成double類型運(yùn)算

四、大小端字節(jié)序和字節(jié)序判斷

當(dāng)我們了解了整數(shù)在內(nèi)存中存儲(chǔ)后,我們調(diào)試看?個(gè)細(xì)節(jié):

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

調(diào)試的時(shí)候,我們可以看到在a中的 0x11223344 這個(gè)數(shù)字是按照字節(jié)為單位,倒著存儲(chǔ)的。這是為什么呢?下面就要講到大小端概念!

4.1 什么是大小端呢?

? ? ? ? ?“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游記》,其中一篇講到有兩個(gè)國家因?yàn)槌噪u蛋究竟是先打破較大的一端還是先打破較小的一端而爭執(zhí)不休,甚至爆發(fā)了戰(zhàn)爭。1981年10月,Danny Cohen的文章《論圣戰(zhàn)以及對(duì)和平的祈禱》(On holy wars and a plea for peace)將這一對(duì)詞語引入了計(jì)算機(jī)界。這么看來,所謂大端和小端,也就是big-endian和little-endian,其實(shí)是從描述雞蛋的部位而引申到計(jì)算機(jī)地址的描述,也可以說,是從一個(gè)俚語衍化來的計(jì)算機(jī)術(shù)語。

這個(gè)術(shù)語引入的目的是什么呢?

計(jì)算機(jī)中,內(nèi)存被分為了一個(gè)個(gè)內(nèi)存單元,每個(gè)內(nèi)存單元的大小是1個(gè)字節(jié),所以當(dāng)我們需要存儲(chǔ)數(shù)據(jù)超過一個(gè)字節(jié)時(shí),就涉及到了存儲(chǔ)順序的問題,根據(jù)存儲(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)存的?地址處。

? ? ? ?這樣直接記憶概念可能有點(diǎn)困難,那有沒有更為簡單的記憶呢?

? ? ? ?在裘宗燕翻譯的《程序設(shè)計(jì)實(shí)踐》里,這對(duì)術(shù)語并沒有翻譯為“大端”和小端,而是“高尾端”和“低尾端”,這就好理解了:如果把一個(gè)數(shù)看成一個(gè)字符串,比如11223344看成"11223344",末尾是個(gè)'\0','11'到'44'個(gè)占用一個(gè)存儲(chǔ)單元,那么它的尾端很顯然是44,前面的高還是低就表示尾端放在高地址還是低地址,它在內(nèi)存中的放法非常直觀,如下圖:

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

? ? ? 我們可以利用高尾端和低尾端來記住大端小端的概念,因?yàn)槲捕说臄?shù)字對(duì)應(yīng)的就是低位字節(jié),如果尾端的數(shù)字在較高地址處,就是高尾端,就是大端,也就是低位字節(jié)被保存在高地址處。同理,如果尾端的數(shù)字在較低地址處,就是低尾端,也就是低位字節(jié)被保存在低地址處。

4.2 為什么有大小端

? ? ? ? ?為什么會(huì)有??端模式之分呢?這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都 對(duì)應(yīng)著?個(gè)字節(jié),?個(gè)字節(jié)為8 bit 位,但是在C語?中除了8 bit 的 char 之外,還有16 bit 的 short 型,32 bit 的 long 型(要看具體的編譯器),另外,對(duì)于位數(shù)?于8位的處理器,例如16位 或者32位的處理器,由于寄存器寬度?于?個(gè)字節(jié),那么必然存在著?個(gè)如何將多個(gè)字節(jié)安排順序的問題。因此就導(dǎo)致了?端存儲(chǔ)模式和?端存儲(chǔ)模式。

? ? ? ?例如:?個(gè) 16bit 的 short 型 x ,在內(nèi)存中的地址為 0x0010 , x 的值為 0x1122 ,那么 0x11 為?字節(jié), 0x22 為低字節(jié)。對(duì)于?端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在?地址中,即 0x0011 中。?端模式,剛好相反。我們常?的 X86 、x64結(jié)構(gòu)是?端模式,? KEIL C51 則為?端模式。很多的ARM,DSP都為?端模式。有些ARM處理器還可以由硬件來選擇是?端模式還是小端模式。

4.3 編寫一個(gè)程序判斷當(dāng)前機(jī)器的字節(jié)序

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

4.4?大小端誰好誰壞?

小端模式:

? ? ? ? ? ? ? ? ? 1、強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)不需要調(diào)整字節(jié)內(nèi)容。(在強(qiáng)制類型轉(zhuǎn)換原理會(huì)解釋)

? ? ? ? ? ? ? ? ? 2、CPU做數(shù)值運(yùn)算時(shí)從內(nèi)存中依順序依次從低位到高位取數(shù)據(jù)進(jìn)行運(yùn)算,直到最后刷? 新最高位的符號(hào)位,這樣的運(yùn)算方式會(huì)更高效

大端模式:

? ? ? ? ? ? ? ? ? ? ? 符號(hào)位判斷固定為第一個(gè)字節(jié),容易判斷正負(fù),便于人類閱讀。

總結(jié):大小端沒有誰更優(yōu)更劣,各種優(yōu)點(diǎn)就是對(duì)方劣勢(shì)。

五、強(qiáng)制類型轉(zhuǎn)換的原理

5.1 int數(shù)據(jù)類型強(qiáng)轉(zhuǎn)char數(shù)據(jù)類型

int數(shù)據(jù)類型強(qiáng)轉(zhuǎn)char數(shù)據(jù)類型的原理就是字節(jié)截?cái)啵?/span>截?cái)?/strong>就是通過簡單地將高位丟棄,保存低位來實(shí)現(xiàn)

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

5.2 char數(shù)據(jù)類型強(qiáng)轉(zhuǎn)int數(shù)據(jù)類型

char數(shù)據(jù)類型強(qiáng)轉(zhuǎn)int數(shù)據(jù)類型的原理就是整型提升!

1. 有符號(hào)整數(shù)提升是按照變量的數(shù)據(jù)類型的符號(hào)位來提升的

2. ?符號(hào)整數(shù)提升,?位補(bǔ)0

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

5.3 大小端和強(qiáng)制類型轉(zhuǎn)換的關(guān)系

? ? ? 大小端(endianness)是指多字節(jié)數(shù)據(jù)在存儲(chǔ)時(shí)的字節(jié)順序。在C語言中,賦值操作是不受大小端影響的。

? ? ? 其中截?cái)嗍峭ㄟ^簡單地將高位丟棄來實(shí)現(xiàn)的,而與數(shù)據(jù)存儲(chǔ)的字節(jié)順序無關(guān) 。

? ? ? 既然無關(guān),那為什么說小端的優(yōu)勢(shì)就是強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)不需要調(diào)整字節(jié)內(nèi)容??

? ? ?雖然截?cái)嗯c數(shù)據(jù)存儲(chǔ)的字節(jié)順序(大小端)無關(guān),但是大小端對(duì)于截?cái)嘈适遣灰粯拥?,假設(shè)在小端模式下把int的4字節(jié)強(qiáng)制轉(zhuǎn)換成short的2字節(jié)時(shí),就直接把int數(shù)據(jù)存儲(chǔ)的前兩個(gè)字節(jié)給short就行,因?yàn)槠淝皟蓚€(gè)字節(jié)剛好就是最低的兩個(gè)字節(jié),符合轉(zhuǎn)換邏輯。

? ? ?這就是說明了大小端對(duì)截?cái)嘈视杏绊懀@就好比化學(xué)反應(yīng)加了催化劑一樣,加與不加的結(jié)果是一樣,但是速度不一樣??!

5.4?相同字節(jié)數(shù)據(jù)類型的強(qiáng)制類型轉(zhuǎn)換

? ? 上述講的都是不同字節(jié)的數(shù)據(jù)類型的強(qiáng)轉(zhuǎn),那如果是相同數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換,比如說int強(qiáng)轉(zhuǎn)float,那恰好都是4個(gè)字節(jié),就不需要補(bǔ)位,也不需要截?cái)?。那他們?qiáng)轉(zhuǎn)之后會(huì)有區(qū)別嗎??

? ? 我們來看下面這個(gè)代碼

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

我們會(huì)發(fā)現(xiàn),當(dāng)我們用int類型存儲(chǔ)9,再用float類型取出9時(shí),得到的結(jié)果是0.000000,而用float類型去存儲(chǔ)9.0時(shí),用int類型取出來時(shí)1091567616?

? ? ?按道理來說,這兩種類型都是四個(gè)字節(jié),不會(huì)出現(xiàn)截?cái)嗪驼吞嵘鎯?chǔ)的內(nèi)容并沒有發(fā)生改變,為什么會(huì)出現(xiàn)這樣的情況??

? ?原因就是因?yàn)椋?span style="color:#fe2c24;">float類型和int類型的存儲(chǔ)方式不一樣??!!下面將介紹浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)!

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

? ? ? ?常?的浮點(diǎn)數(shù):3.14159、1E10(E表示底數(shù)是10)等,浮點(diǎn)數(shù)家族包括: float(4字節(jié))、double(8字節(jié))、long double(8字節(jié)) 類型。

? ? ? ?浮點(diǎn)數(shù)表?的范圍:float.h中定義

6.1 浮點(diǎn)數(shù)的存儲(chǔ)形式

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

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

為什么是這樣的形式呢?這就跟科學(xué)計(jì)數(shù)法有關(guān)系。下面通過一個(gè)例子來說明:

10進(jìn)制的5.5應(yīng)該怎么轉(zhuǎn)換成二進(jìn)制呢?

5變成2進(jìn)制是101 ,0.5變成2進(jìn)制是2^-1,所以可以其二進(jìn)制形式可以寫成101.1,用科學(xué)計(jì)數(shù)法來表示就是1.011*2^2,類比上圖的表示形式我們可以發(fā)現(xiàn),此時(shí)S=0,M=1.011,E=2.

既然浮點(diǎn)數(shù)可以寫成科學(xué)計(jì)數(shù)法的形式,并且可以算出對(duì)應(yīng)的S M E,所以我們實(shí)際上只需要在內(nèi)存中將S M E 存儲(chǔ)起來即可!!

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

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

6.2 浮點(diǎn)數(shù)存的過程

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

6.2.1 M

? ? ? 前?說過, 1≤M<2 ,也就是說,M可以寫成 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ù)字(這樣的話精度會(huì)更高?。。?/strong>。以32位浮點(diǎn)數(shù)為例,留給M只有23位,將第?位的1舍去以后,等于可以保存24位有效數(shù)字。

6.2.2 E

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

? ? ?先,規(guī)定E為?個(gè)?符號(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。

6.3 浮點(diǎn)數(shù)取的過程

6.3.1 E不全為0或不全為1(常規(guī)方式)

? ? ? 這時(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)制表示形式為:0? ? ?01111110? ? ? 00000000000000000000000

6.3.2 E全為0

? ? ?這時(shí),浮點(diǎn)數(shù)的指數(shù)E等于1-127(或者1-1023)即為真實(shí)值,有效數(shù)字M不再加上第?位的1,?是還 原為0.xxxxxx的?數(shù)。這樣做是為了表?±0,以及接近于0的很?的數(shù)字。

6.3.3 E全為1

? ??這時(shí),如果有效數(shù)字M全為0,表?±?窮?(正負(fù)取決于符號(hào)位s)

6.4 題目解析

? ?明白了浮點(diǎn)數(shù)的存儲(chǔ)形式,我們就一起對(duì)5.4的那道題進(jìn)行解析

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

6.4.1 為什么9還原成浮點(diǎn)數(shù)變成了0.000000?

9為整型,在內(nèi)存中存儲(chǔ)為00000000 00000000 00000000 00001001

轉(zhuǎn)換為float類型后,將其按照浮點(diǎn)數(shù)形式拆分,得到第1位符號(hào)位s=0,后面8位指數(shù)位為00000000,最后23位有效數(shù)字M=000 0000 0000 0000 0000 1001

因?yàn)橹笖?shù)E全為0,所以符合E全為0的情況

?V=(-1)^0*0.00000000000000000001001*2^(-126)=1.001*2^(-146)

顯然V是一個(gè)接近于0的正數(shù),且%f占位符最多保存6位,所以打印出來就是0.000000

6.4.2 為什么浮點(diǎn)數(shù)9.0,用整數(shù)打印是1091567616?

首先浮點(diǎn)數(shù)9.0等于二進(jìn)制的1001.0,換成科學(xué)計(jì)數(shù)法就是1.001*2^3

即S=0,M=1.001,E=3

首先是第一位符號(hào)位S=0,有效數(shù)字M等于001后面再加20個(gè)0,湊滿23位,指數(shù)E等于3+127=130,即10000010

按照S+E+M的方式寫成二進(jìn)制就是

0 10000010 001 0000 0000 0000 0000 0000

轉(zhuǎn)換成10進(jìn)制就是就是1091567616

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

6.5 浮點(diǎn)數(shù)的存儲(chǔ)可能有什么問題??

6.5.1 浮點(diǎn)數(shù)在內(nèi)存中可能存在部分?jǐn)?shù)無法精確保存

對(duì)于float(double)類型來說,留給M的只有23(52)位,有可能存在某些數(shù)及時(shí)將全部位都用上了,都湊不齊,下面有個(gè)例子99.7

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

6.5.2 double類型的精度比float類型高

double類型留給E和M的位數(shù)都更大,所以相對(duì)來說精度會(huì)更高!

6.5.3 兩個(gè)浮點(diǎn)數(shù)比較大小時(shí),直接使用==可能會(huì)存在問題。

? ? ? ?因?yàn)楦↑c(diǎn)數(shù)在內(nèi)存中有時(shí)候無法精確保存,所以使用==可能會(huì)存在問題,所以一般來說,我們會(huì)設(shè)置一個(gè)我們可以接收的精度,如果他們之間的差距在這個(gè)精度之內(nèi),就把他們視為相等。

比如我想要判斷浮點(diǎn)數(shù)a==5.6,假設(shè)我們?cè)O(shè)置的精度是0.000001,那么我們可以將if(a==5.6)改寫成if(abs(f-5.6)<=0.000001)。

? ? ?關(guān)于浮點(diǎn)數(shù)的比較在 《C語言深度解剖》這本書中有介紹。

七、signed char和unsigned char的取值范圍

char類型是1個(gè)字節(jié),一共是8個(gè)比特位

? ? ? ? 對(duì)于signed char來說,首位是符號(hào)位,后面7位是數(shù)值位,所以最大應(yīng)該是01111111即127,最小應(yīng)該位11111111即-127,但是由于10000000和00000000一個(gè)表示-0,一個(gè)表示0,為了避免0的兩種表示形式,將10000000定為-128,所以signed char的取值范圍是-128~127

? ? ? 對(duì)于unsigned char來說,8個(gè)位都是數(shù)值位,所以最大為11111111即255,最小為00000000即0,所以unsigned char類型的取值范圍是0~255.

八、進(jìn)制數(shù)的輪回

? ? ? ?這是一個(gè)做題技巧,以char類型為例,我們從00000000開始舉出char類型的所以可能性

00000000、00000001、000000010………………01111111、10000000、10000001……11111111

? ? ?從左到右是0 1 2 3 4 5 …………當(dāng)?shù)竭_(dá)011111111達(dá)到最大正數(shù)127,再+1得到10000000是最大負(fù)數(shù)-128 再往下加就是-127 -126……………………一直到-1。

? ? ? ?我們發(fā)現(xiàn)從00000000開始,不斷+1是從0-127? ?127跳到-128? ? ?-128--1? ?這是一個(gè)輪回。11111111再+時(shí)變成100000000 此時(shí)達(dá)到9位,首位丟失,所以又是00000000即0,所以如果一直+1,會(huì)一直按照0-127??-128--1 這樣循環(huán)下去??!

九、經(jīng)典例題

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記

C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式,數(shù)據(jù)在內(nèi)存中的存儲(chǔ),c語言,開發(fā)語言,筆記文章來源地址http://www.zghlxwxcb.cn/news/detail-817124.html

到了這里,關(guān)于C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    什么叫做浮點(diǎn)數(shù),就是有小數(shù)的數(shù)據(jù)就要浮點(diǎn)數(shù),比如:5.5 6.5 9.0等一些數(shù)據(jù)就叫浮點(diǎn)數(shù),那么浮點(diǎn)數(shù)又是怎么在內(nèi)存中存放的呢,下面聽我一一道來。 浮點(diǎn)型的家族包括:float double long double 我們以以下代碼為例比較下浮點(diǎn)數(shù)和整型數(shù)據(jù)內(nèi)存中的存儲(chǔ)是如何的: 打印的結(jié)果

    2024年02月07日
    瀏覽(20)
  • C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    C語言:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    在講解操作符的時(shí)候,我們就講過了下?的內(nèi)容: 整數(shù)的2進(jìn)制表示方法有三種,即 原碼、反碼和補(bǔ)碼 三種表示方法均有 符號(hào)位 和 數(shù)值位 兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位最高位的?位是被當(dāng)做符號(hào)位,剩余的都是數(shù)值位。 正整數(shù)的原、反、

    2024年04月10日
    瀏覽(33)
  • 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(C語言)

    數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(C語言)

    ? ?? 歡迎大家來到貝蒂大講堂?? ? ????養(yǎng)成好習(xí)慣,先贊后看哦~???? ? 所屬專欄:C語言學(xué)習(xí) ? 貝蒂的主頁:Betty‘s blog ? 我們?cè)缇蛯W(xué)完基本的數(shù)據(jù)類型,那這些數(shù)據(jù)類型到底在內(nèi)存中怎么存儲(chǔ)的呢~,今天貝蒂就帶大家一起深入學(xué)習(xí)一下吧 1.1 整型 貝蒂說:“因

    2024年02月02日
    瀏覽(18)
  • 【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    我們可以把數(shù)據(jù)類型想象為一個(gè)矩形盒子,int、char 等類型 分別為不同的盒子 可以放著不同大小的東西(數(shù)據(jù))(即所占存儲(chǔ)空間的大?。?類型的的意義: 使用這個(gè)類型開辟內(nèi)存空間的大小(大小決定了使用范圍) 如何看待內(nèi)存空間的視角。 注意 : 字符在內(nèi)存中存儲(chǔ)的是

    2024年02月13日
    瀏覽(30)
  • 【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(一)

    【C語言】數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(一)

    內(nèi)置類型: 所占空間的大?。?類型的意義: 使用這個(gè)類型開辟空間的大小,決定只能使用的范圍。 整型家族: 浮點(diǎn)型家族: 構(gòu)造類型: 指針類型: 空類型: void表示空類型 通常用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型。 變量創(chuàng)建是要在內(nèi)存開辟空間的,空間的大小

    2024年02月10日
    瀏覽(26)
  • 『C語言』數(shù)據(jù)在內(nèi)存中的存儲(chǔ)規(guī)則

    『C語言』數(shù)據(jù)在內(nèi)存中的存儲(chǔ)規(guī)則

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : C語言 ??? 每日語錄 : 精誠所至,金石為開。 ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。 小羊近期已經(jīng)將C語言初階學(xué)習(xí)

    2024年02月12日
    瀏覽(24)
  • 整形數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(C語言)

    整形數(shù)據(jù)在內(nèi)存中的存儲(chǔ)(C語言)

    1.整形家族 2.(原碼、反碼、補(bǔ)碼)基礎(chǔ)知識(shí) 計(jì)算機(jī)中的整數(shù)有三種2進(jìn)制表示方法,即原碼、反碼和補(bǔ)碼。 三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”。 正數(shù)的原、反、補(bǔ)碼都相同。 負(fù)整數(shù)的三種表示方法各不相同。 原碼 直接將數(shù)值

    2024年01月25日
    瀏覽(19)
  • 【C語言】詳解數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    【C語言】詳解數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    計(jì)算機(jī)能夠處理的是二進(jìn)制的數(shù)據(jù), 整形和浮點(diǎn)型數(shù)據(jù)在內(nèi)存中也都是以二進(jìn)制的形式存儲(chǔ)的。 整數(shù)2進(jìn)制表示方法,即原、反、補(bǔ)碼,三種均有 符號(hào)位 和 數(shù)值位 倆部分,符號(hào)位用0表示 正 ,1表示 負(fù) 。 正 的整數(shù):原、反、補(bǔ)碼相同。 負(fù) 的整數(shù):原、反、補(bǔ)碼要進(jìn)行計(jì)

    2024年02月08日
    瀏覽(25)
  • 『C語言進(jìn)階』數(shù)據(jù)在內(nèi)存中的存儲(chǔ)規(guī)則

    『C語言進(jìn)階』數(shù)據(jù)在內(nèi)存中的存儲(chǔ)規(guī)則

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : C語言 ??? 每日語錄 : 精誠所至,金石為開。 ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。 小羊近期已經(jīng)將C語言初階學(xué)習(xí)

    2024年02月10日
    瀏覽(22)
  • C語言—深度剖析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    C語言—深度剖析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    內(nèi)置類型(C語言本身就具有的類型): 類型的意義: 1.使用這個(gè)類型開辟內(nèi)存空間的大?。ù笮Q定了使用的范圍) 2.如何看待內(nèi)存空間的視角 整形家族: 注:字符類型底層存儲(chǔ)的是這個(gè)字符的ASCII值,ASCII值是個(gè)整數(shù) 浮點(diǎn)數(shù)家族: 構(gòu)造類型(自定義類型): 數(shù)組類型 注

    2024年02月03日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包