資料在記憶體中的儲存

2021-10-10 16:46:02 字數 3910 閱讀 1776

先來介紹資料型別:

在32位平台下所佔位元組

char

//字元資料型別 (1)

short

//短整型 (2)

int//整形 (4)

long

//長整型 (4)

long

long

//更長的整形 (8)

float

//單精度浮點數 (4)

double

//雙精度浮點型 (8)

//注意: c語言中沒有字串型別

型別的基本歸類:整形家族

char

unsigned

char

signed

char

short

unsigned

short

[int

]signed

short

[int

]int

unsigned

intsigned

intlong

unsigned

long

[int

]signed

long

[int

]

浮點數家族:

float

double

構造型別:

> 陣列型別

> 結構體型別 struct

> 列舉型別 enum

> 聯合型別 union

指標型別 空型別:

int

*pi;

char

*pc;

float

*pf;

void

*pv;

void 表示空型別(無型別)通常應用於函式的返回型別、函式的引數、指標型別。

整形在記憶體中的儲存:上面有講到每種型別在記憶體中儲存時各自開闢空間的大小,下面我們先來看在記憶體中存的是什麼:

實際上對整形來說:資料存放記憶體中其實存放的是補碼。

先來介紹一下原碼,反碼,補碼

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種方法均有符號位和數值位兩部分,符號位 0 表示正數, 符號位 1 表示負數,而數值位,三種表示方法各不相同。

原碼:直接將二進位制按照正負數的形式翻譯成二進位制就可以了。

反碼:將原碼的符號位不變,其他位依次按位取反就可以得到了。

補碼:反碼 +1 就得到補碼。

正數的原碼、反碼、補碼相同。

下面我們來看看整形在記憶體中儲存的例子:

int a=20;

int b=-10

;

a變數

因為a為正數,所以在儲存的時候先將十進位制數,轉化為二進位制數原碼,並且因為是正數,所以原、反、補碼相同,不用轉化。

b變數

因為b為負數,在進行十進位制轉化為二進位制原碼後,要進行原碼和補碼之間的轉化,轉化過程為符號位不變其他位按位取反,再加一。

但是仔細觀察的同學發現這裡的儲存為什莫不是按順序存的呢?

這就要簡單的說一下大端儲存和小端儲存

小端儲存

低位址存低資料;高位址存高資料

大端儲存

低位址存高資料;高位址存底資料

** 為什莫會有大小端模式之分呢?**

這是因為在計算機系統中,我們是以位元組為單位的,

每個位址單元都對應著乙個位元組,乙個位元組為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處理器還可以由硬體來選擇是大端模式還是小端模式。

顯而易見我們這裡是小端儲存。

下來我們再來介紹一下浮點型儲存

先來看乙個例子

int

main

(void

)

看一下呢列印結果

為什麼會是這樣呢?

其實只要我們了解了浮點數在記憶體中是如何儲存的,這個問題就很好解決!

根據國際標準ieee 754,任意乙個二進位制浮點數v可以表示成下面的形式:

· (-1)^s * m * 2^e。

· (-1)^s 表示符號位,當s == 0, v為正數;當s == 1, v為負數。

· m表示有效數字,大於等於1,小於2、

· 2^e表示指數字。

舉個例子:十進位制的5.0,轉化成二進位制就變成了101.0,用科學計數法表示就是 1.01 * 2^2 。那麼,按照上面v的格式,可以得出s = 0, m = 1.01,e = 2 。

如果是-5.0,s = 1, m = 1.01, e = 2 。
ieee 754規定:對於32位浮點數,最高的1位是符號位s, 接著的8位是指數e,剩下的23位為有效數字m。

e的兩種特殊取值:

e全為0:這個數表示乙個趨於0很小的數,一般記為0

2.e全為1:表示無窮

那麼我們回到上面的例題,

n = 9 的儲存方式是

0000 0000 0000 0000 0000 0000 0000 1001

float *pfloat = (float )&n 將n強制型別轉換為float形

系統就是認為上面的儲存方式是浮點數的儲存方式

即1.000000000000000000010012^-127

是乙個及其接近0的數字,所以列印0

第二種輸入方法一樣,給指標賦值9.0,指標是浮點型,

所以系統按照浮點數的儲存方式存放這個數字,

n為整形,系統輸出n的時候按照整形的在記憶體中的儲存方式去讀,

所以輸出n為乙個非常大的數字。

完。。。。

資料在記憶體中的儲存

身為乙個天天處理資料的人,不得不說資料在記憶體中的儲存是必須要知道的問題。首先,資料在記憶體中的儲存涉及到作用域,儲存位置等方面的問題。根據資料的作用域,可將資料劃分為區域性變數和全域性變數 區域性變數的作用域為從定義開始到函式執行結束 全域性變數的作用域從程式開始到程式結束。計算機的記憶體分配可以...

資料在記憶體中的儲存

大端,把乙個數字高位位元組序的內容儲存到低位址,低位位元組序內容儲存到高位址處 小端,把乙個數字高位位元組序的內容儲存到高位址,低位位元組序內容儲存到低位址處 判斷乙個機器是大端還是小端?指標判斷 int checksys 聯合體 共用體 union un int main 這裡首先需要知道的是,例...

資料在記憶體中的儲存

我們都知道在計算機中資料型別都有 char 1 short 2 int 4 long 4 8 float 4 double 8 等內建型別,以及他們所佔的空間大小。型別的意義 1.使用這個型別開闢記憶體空間的大小 大小決定使用範圍 2.如何看待記憶體空間的視角。型別歸類 整形家族 char unsi...