天天看點

【C語言】整型在記憶體中的存儲資料類型介紹整型整型在記憶體中的存儲【總結】

目錄

  • 資料類型介紹
  • 整型
  • 整型在記憶體中的存儲
    • 大小端介紹
    • 代碼實作判斷目前機器的位元組序
  • 【總結】

資料類型介紹

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的二進制序列在記憶體是如何存儲的:

【C語言】整型在記憶體中的存儲資料類型介紹整型整型在記憶體中的存儲【總結】

首先來看a變量的二進制序列在記憶體中的存儲:可以看出a在記憶體中的二進制序列是0a 00 00 00,這是十六進制的形式,我們知道10的二進制序列為:

00000000000000000000000000001010,轉換為十六進制是00 00 00 0a

【C語言】整型在記憶體中的存儲資料類型介紹整型整型在記憶體中的存儲【總結】

這裡介紹一下負數的二進制存儲:

對有符号數來說,其二進制有原碼,反碼和補碼三種形式,而整型在電腦中是以補碼的形式存儲的,三者之間存在轉換關系,原碼為一個數直接轉化為二進制,反碼為原碼保留符号位不變,其他位按位取反,補碼位反碼+1

比如 -1,

原碼:10000000000000000000000000000001,(最前面的1為符号位,符号位為0,即為正數,為1則為負數)

反碼:1111111111111111111111111111111111110,(符号位1不變,其他位按位取反)

原碼:1111111111111111111111111111111111111,(反碼加一)

我們再看看b的二進制序列再記憶體中的存儲:b在記憶體中存儲的序列是

f6 ff ff ff, b = -10,而-10的二進制序列為:11111111111111111111111111110110,轉換為十六進制即為:

ff ff ff f6

可以看到,整型在記憶體中的存儲好像是順序颠倒了過來,這是為什麼呢?

大小端介紹

這裡來介紹一下大端(存儲)模式和小端(存儲)模式。

大端(存儲)模式:是指資料的低位儲存在記憶體的高位址中,而資料的高位儲存在記憶體的低位址中。

小端(存儲)模式:是指資料的高位存儲在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。

這是什麼意思呢?舉個例子:

【C語言】整型在記憶體中的存儲資料類型介紹整型整型在記憶體中的存儲【總結】

而我們的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;
}
           

實作效果:

【C語言】整型在記憶體中的存儲資料類型介紹整型整型在記憶體中的存儲【總結】

【總結】

整形在記憶體中有大端和小端兩種存儲方式,不同的處理器模式不同,而我們使用的x86結構是小端存儲。

繼續閱讀