先來介紹資料型別:
在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可以表示成下面的形式:舉個例子:十進位制的5.0,轉化成二進位制就變成了101.0,用科學計數法表示就是 1.01 * 2^2 。那麼,按照上面v的格式,可以得出s = 0, m = 1.01,e = 2 。· (-1)^s * m * 2^e。
· (-1)^s 表示符號位,當s == 0, v為正數;當s == 1, v為負數。
· m表示有效數字,大於等於1,小於2、
· 2^e表示指數字。
如果是-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...