天天看點

C語言資料的存儲-上

由于内容較多,是以分成了兩部分,資料的存儲-下我會盡快趕出來的。贊不贊的無所謂,隻希望看到的讀者可以花上您珍貴的幾分鐘看看我所寫得文章。

首先介紹一下資料類型都有哪些

整形類

浮點型類

構造類型(自定義類型)

指針類型

空類型

建立這些類型的意義是:

使用不同類型決定了開辟記憶體空間的大小(空間大小決定适用範圍)

類型決定了看待記憶體空間的視角

其次我們先來講解整形在記憶體中的存儲形式

如果要建立一個變量,就需要在記憶體中開辟空間,開辟空間的大小與類型有關,那麼接下來我們看看變量到底是如何在記憶體中存儲的。

先來了解一下原碼,反碼,補碼的概念。

計算機中的有符号數有三種表示方式,即原碼、反碼和補碼

三種表示方式均有符号位和數值位兩部分,符号位都是用0表示‘“正”,用1表示“負”,而數值位三種表示方式各不相同。

原碼:直接将二進制按照正負數的形式翻譯成二進制即可

反碼:原碼符号位不變,其他位依次按位取反即可

補碼:反碼加一即可

以上是負數求原反補碼的方式,正數的原反補碼相同。

對于整形而言:資料存放于記憶體中其實存放的是補碼

原因是

在計算機系統中,數值一律用補碼來表示和存儲。原因在于,使用補碼可以将符号位和數值域統一處理;同時,加法和減法也可以統一處理(cpu隻有加法器)此外,補碼與原碼互相轉換,其運算過程是相同的,不需要額外的硬體電路。

展示一下正數負數例子

C語言資料的存儲-上
C語言資料的存儲-上

那麼由此就又衍生出了一個問題,上圖的補碼和記憶體中的存儲順序為什麼不同呢?

接下來,為探讨這個問題我們再舉個栗子,假設現在要存0x 11 22 33 44這個數字要怎麼存呢?

C語言資料的存儲-上

大端位元組序存儲:把一個資料的低位位元組(如上圖第一種)的内容,存放在高位址上;高位位元組的内容,則存放在低位址上。

小端位元組序存儲:把一個資料的低位位元組(如上圖第二種)的内容,存放在低位址上;高位位元組的内容,則存放在高位址上。

這是因為在計算機系統中,我們是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個位元組,那麼必然存在着一個如何将多個位元組安排的問題。是以就導緻了大端存儲模式和小端存儲模式。 例如一個 16bit 的 short 型 x ,在記憶體中的位址為 0x0010 , x 的值為 0x1122 ,那麼 0x11 為高位元組, 0x22為低位元組。對于大端模式,就将 0x11 放在低位址中,即 0x0010 中, 0x22 放在高位址中,即 0x0011 中。小端模式,剛好相反。我們常用的 x86 結構是小端模式,而 keil c51 則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。

那麼在此可以出一個程式設計小題目:請設計一個程式以判斷目前平台的存儲方式為大端還是小端?

c語言資料的存儲-上 至此完。

希望有看到的大佬多多指教。

繼續閱讀