目錄
- 資料類型介紹
- 整型
- 整型在記憶體中的存儲
-
- 大小端介紹
- 代碼實作判斷目前機器的位元組序
- 【總結】
資料類型介紹
C語言中的類型有整形,浮點型,構造類型,指針類型和空類型。
類型的意義主要有兩點:
1.決定了使用這個類型所開辟記憶體的大小(大小決定了使用範圍)。
2.決定了如何看待記憶體空間的視角
整型
char:
unsigned char
signed char
int:
unsigned int
signed int
short:
unsigned short (int)
signed short (int)
long:
unsigned long (int)
signed long (int)
整型在記憶體中的存儲
一個變量的建立在記憶體中是要開辟一片空間的,而空間的大小根據不同的類型而不同。那麼,整型在記憶體中是怎麼存儲的?
我們先來看一段代碼:
int main()
{
int a = 10;
int b = -10;
return 0;
}
對這段代碼調試一下,在對a和b指派後,看一下a和b的二進制序列在記憶體是如何存儲的:
首先來看a變量的二進制序列在記憶體中的存儲:可以看出a在記憶體中的二進制序列是0a 00 00 00,這是十六進制的形式,我們知道10的二進制序列為:
00000000000000000000000000001010,轉換為十六進制是00 00 00 0a
這裡介紹一下負數的二進制存儲:
對有符号數來說,其二進制有原碼,反碼和補碼三種形式,而整型在電腦中是以補碼的形式存儲的,三者之間存在轉換關系,原碼為一個數直接轉化為二進制,反碼為原碼保留符号位不變,其他位按位取反,補碼位反碼+1
比如 -1,
原碼:10000000000000000000000000000001,(最前面的1為符号位,符号位為0,即為正數,為1則為負數)
反碼:1111111111111111111111111111111111110,(符号位1不變,其他位按位取反)
原碼:1111111111111111111111111111111111111,(反碼加一)
我們再看看b的二進制序列再記憶體中的存儲:b在記憶體中存儲的序列是
f6 ff ff ff, b = -10,而-10的二進制序列為:11111111111111111111111111110110,轉換為十六進制即為:
ff ff ff f6
可以看到,整型在記憶體中的存儲好像是順序颠倒了過來,這是為什麼呢?
大小端介紹
這裡來介紹一下大端(存儲)模式和小端(存儲)模式。
大端(存儲)模式:是指資料的低位儲存在記憶體的高位址中,而資料的高位儲存在記憶體的低位址中。
小端(存儲)模式:是指資料的高位存儲在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。
這是什麼意思呢?舉個例子:
而我們的x86結構是小端(存儲)模式,是以在記憶體中會出現颠倒的現象。
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為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處理器還可以由硬體來選擇是大端模式還是小端模式。
代碼實作判斷目前機器的位元組序
思路很簡單,隻需要通過char*型的指針取出一個數的位址并解引用,判斷其為大端還是小端。以1為例,若解引用後為1,則為小端,反之為大端。
代碼實作:
int main()
{
int a = 1;
char* c = (char*)&a;
if (*c == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
實作效果:
【總結】
整形在記憶體中有大端和小端兩種存儲方式,不同的處理器模式不同,而我們使用的x86結構是小端存儲。