網(wǎng)站建設(shè)這個(gè)口碑營銷的步驟
寫在開頭
關(guān)于復(fù)習(xí)的相關(guān)內(nèi)容其實(shí)從一開始就列出了大綱,但是遲遲沒有開始復(fù)習(xí),一方面是因?yàn)閷W(xué)校學(xué)業(yè)卻是繁忙,另一方面還是內(nèi)心對(duì)舊知識(shí)掌握不熟練需要再學(xué)一遍的畏懼和懶惰,但如今,復(fù)習(xí)必須開始了。今天我從C語言的最開始,數(shù)據(jù)存儲(chǔ)開始講起,慢慢回憶起塵封的往事---C語言。
C語言數(shù)據(jù)儲(chǔ)存
數(shù)據(jù)類型的基本介紹
在C語言中,最基本的內(nèi)置類型是必須要求掌握的。這也非常普遍的應(yīng)用于我們的代碼編寫中。他們分別是
-
屬于整型:
-
char (unsigned char & signed char)
-
short (unsigned short & signed short)
-
int (unsigned int & signed int)
-
long (unsigned long & signed long)
-
long long
-
-
屬于浮點(diǎn)數(shù)
-
float
-
double
-
long double
-
-
屬于構(gòu)造類型
-
數(shù)組類型
-
結(jié)構(gòu)體類型 struct
-
枚舉類型 enum
-
聯(lián)合類型 union
-
-
指針類型
-
空類型 (void) 通常用在函數(shù)的返回類型,函數(shù)參數(shù),指針類型等。
整型在內(nèi)存中的存儲(chǔ)
在語言的層面,創(chuàng)建一個(gè)變量是在內(nèi)存中開辟出空間,而開辟多少空間的依據(jù)是變量本身的類型。比如int 類型的變量在被分配空間時(shí),會(huì)被分配4個(gè)字節(jié),也就是32bit 位的空間。那么數(shù)據(jù)到底在所開辟出來的內(nèi)存中是如何存儲(chǔ)的呢?
原碼、反碼、補(bǔ)碼
計(jì)算機(jī)中總共有三種對(duì)整數(shù)的二進(jìn)制表示方法,分別是原碼、反碼、補(bǔ)碼。
三種表示方法中,都有符號(hào)位和數(shù)值位兩部分組成。符號(hào)位0為正,1為負(fù)。而數(shù)值位略微復(fù)雜,需要分為正數(shù)和負(fù)數(shù)兩種情況,正數(shù)的原反補(bǔ)都相同,負(fù)數(shù)的三種表示方法均不同。下面介紹一下原碼、反碼和補(bǔ)碼:
原碼:直接將數(shù)值按照正負(fù)數(shù)的形式翻譯成二進(jìn)制就可以得到原碼。
反碼:原碼的符號(hào)位不變,其他位依次按位取反得到反碼。
補(bǔ)碼:反碼+1得到補(bǔ)碼。
對(duì)于整型數(shù)據(jù),內(nèi)存中存放的是補(bǔ)碼。
因?yàn)?#xff1a;在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;同時(shí),加法和減法也可以統(tǒng)一處理 (在CPU中只有加法器,利用補(bǔ)碼可以做到加減統(tǒng)一處理);此外,補(bǔ)碼和原碼的相互轉(zhuǎn)化,運(yùn)算過程相同,不需要額外的硬件電路。
那我們可以嘗試著算一下20 和 -10 在內(nèi)存中的存儲(chǔ)。
????????
但是如果我們?cè)赩Scode中輸入
?int?main(){int?a?=?20;int?b?=?-10;return?0;}
并且監(jiān)視內(nèi)存,可以發(fā)現(xiàn)a、b變量在內(nèi)存中的顯示分別為
?a?:?0x14?00?00?00b?:?0xf6?ff?ff?ff
它們?cè)趦?nèi)存中顯示的是0x前綴,代表是16進(jìn)制,但是卻與我們轉(zhuǎn)化的恰好相反,這是因?yàn)榇笮《舜鎯?chǔ)模式。
大小端模式
大端存儲(chǔ)模式:數(shù)據(jù)的低位保存在內(nèi)存的高地址中,數(shù)據(jù)的高位保存在內(nèi)存的低地址中。
小端存儲(chǔ)模式:數(shù)據(jù)的低位保存在內(nèi)存的低地址中,數(shù)據(jù)的高位保存在內(nèi)存的高地址中。
記憶方法:小->低->低,剩下相反。
為什么存在大小端模式之分:計(jì)算機(jī)系統(tǒng)以字節(jié)作為內(nèi)存的單位,每個(gè)地址對(duì)應(yīng)一個(gè)字節(jié)。對(duì)于位數(shù)大于8位 (bit) 的處理器,由于寄存器的寬度大于1字節(jié),那么必然存在著多字節(jié)間排列的問題,因此導(dǎo)致了大端存儲(chǔ)和小端存儲(chǔ)。
常用機(jī)器一般采取小端模式。
?//判斷當(dāng)前機(jī)器字節(jié)序列int?check_sys(){int?i?=?1;return?(*(char*)&i);}int?main(){int?ret?=?cheack_sys();if(ret?==?1){printf("小端");}else{printf("大端");}return?0;}
浮點(diǎn)數(shù)的存儲(chǔ)
浮點(diǎn)數(shù)的表示范圍在 float.h 中定義。
根據(jù)國際標(biāo)準(zhǔn)IEEE754,任何一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:
?(-1)^S?*?M?*?2^E// (-1)^S 表示符號(hào)位。當(dāng)S=0,V為正數(shù);S=1,V為負(fù)數(shù)// M代表有效數(shù)字,大于等于1,小于2。//所以M只可能寫成1.xxxxxxx的形式,計(jì)算機(jī)會(huì)默認(rèn)略去小數(shù)點(diǎn)前面的1,只會(huì)保存小數(shù)位,這樣可以節(jié)省1為有效數(shù)字。// 2^E 表示指數(shù)位。E位一個(gè)無符號(hào)整數(shù)。但是科學(xué)計(jì)數(shù)法中指數(shù)位是可以出現(xiàn)負(fù)值的。所以IEEE754規(guī)定,存入內(nèi)存時(shí)E的真實(shí)值必須加上中間數(shù),32位浮點(diǎn)數(shù),中間數(shù)位127,64位浮點(diǎn)數(shù),中間數(shù)為1023.// 比如E = 10,保存成32位浮點(diǎn)數(shù)時(shí),保存為10+127 = 137// 就是帶符號(hào)位的二進(jìn)制的科學(xué)計(jì)數(shù)法
IEEE 754規(guī)定:
32位的浮點(diǎn)數(shù),最高位的1位是符號(hào)位S,緊接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。
64位的浮點(diǎn)數(shù),最高位的1位是符號(hào)位S,緊接著11位是指數(shù)E,剩下的52位為有效數(shù)字M。
指數(shù)E可以細(xì)分為三種情況。
-
二進(jìn)制E不全為0或者不全為1
浮點(diǎn)數(shù)采用下面規(guī)則表示,E的計(jì)算值減去中間數(shù)(127 或者 1023),得到真實(shí)值。M加上第一位的1,得到真實(shí)的有效數(shù)字。
舉例:
-
二進(jìn)制E全為0 (極限接近0的小數(shù))
浮點(diǎn)數(shù)的指數(shù)位E就等于 1 - 中間值,即為真實(shí)值。
M不再加上1,而是還原為0.xxxxxx的小數(shù),用于表示極限接近于0的很小的數(shù)字。
-
二進(jìn)制E全為1 (正負(fù)∞)
正負(fù)取決于符號(hào)位
數(shù)據(jù)存儲(chǔ)小節(jié)完。