計算機系統討論課 1 資料在記憶體中的儲存方式

2021-09-12 07:24:04 字數 1830 閱讀 4512

#include int main()

; char b[6] = ;

int c[2]=;

short d[2]=;

float e[2]=;

printf("%d, %d, %d, %d\n", sizeof(char), sizeof(int), sizeof(short), sizeof(float));

printf("%s\n", a);

printf("%s\n", b);

printf("%s\n", c);

printf("%s\n", d);

printf("%s\n", e);

return 0;

}

這段**實現了什麼?仿照以上**,應用gcc,定義短整型陣列列印出結果,並比較分析。如果是定義為浮點陣列,列印出什麼樣的結果?

為了解答這些問題,首先我們要明確的是,printf中%s究竟是如何運作的。事實上, %s的原理是從首位址開始,逐字節地將儲存單元中的資料轉化為ascii字元輸出,直到儲存單元中儲存的資料為'\0',即0x00

printf("%s\n", a);中a代表字元陣列的首位址。於是,printf從'h'開始列印,逐字節列印出'n', 'u', 'e', 'r',遇到'\0'時停止列印,此時,列印出的所有字元為"hnuer"。

其中儲存的值為ascii碼的十進位制表示,通過查表可以發現,對應的ascii字元為,與陣列a相同,列印的結果同樣為"hnuer"。

先看第乙個元素(101<<24)+(85<<16)+(78<<8)+(72)。由於其左移的位數都是8的倍數,我們把101,85,78,72轉換為十六進製制來觀察,分別為0x65,0x55,0x4e,0x48。0x65的二進位制數左移24位,相當於0x65左移6位,即0x65000000。同樣的,對剩下幾個數進行類似的移位,相加後得到數0x65554e48。對於第二個元素114,我們知道,int的大小為4個位元組,將整型的114轉換為十六進製制,得到的數為0x00000072

按照常規想法,記憶體中的這兩個數的排列方式為

65554e4800000072,通過%s逐字節地輸出,理論上輸出的應該是"eunh",然而實際上,輸出的卻是"hnuer"!

這就牽扯到了cpu記憶體中資料的排列方式。在cpu中,資料的儲存模式是小端模式,即資料的低位元組儲存於記憶體的低位址中

於是,當用%s輸出整型陣列c時,傳給%s的位址為陣列c的首位址0000,%s逐字節地輸出0x48, 0x4e, 0x55, 0x65, 0x72所代表的ascii字元(遇到0x00時停止),輸出的即是"hnuer"。

短整型short的大小為2個位元組。由上文可知,(101<<24)+(85<<16)+(78<<8)+(72)的十六進製制數是0x65554e48,而這個數長度已達4個位元組,若用short來儲存,則會發生溢位——得到0x4e48。而114同理得到0x0072。根據小端的原理,在記憶體中陣列d的資料排列為484e7200, 輸出得到"hnr"。

其在windows下輸出"潽卜",而在linux下輸出"???n"。我也不知道為什麼..................待填。

可以看出,%s這種逐字節、遇'\0'停止的輸出方式,很容易造成記憶體洩露等問題,需要謹慎使用。

計算機系統記憶體管理

在計算機系統中程序之間是共享物理記憶體和其他系統資源的。為了更加有效管理記憶體和減少出錯,現代系統提供了一種對主存的抽象概念,叫做虛擬記憶體,它為每個程序提供了乙個大的 私有的和一致的記憶體空間。物理記憶體通常是具有掉電就丟失的高速ram構成,而虛擬記憶體通常是指在硬碟上開闢的一塊區域。虛擬記憶體有...

1 認識計算機系統

目錄 計算機系統硬體組成 匯流排 i o裝置 記憶體 處理器dma傳輸 作業系統 系統程式設計 vs.應用程式設計 錯誤處理 貫穿整個系統的一組電子管道稱為匯流排,分為 片內匯流排 cpu內部 系統匯流排 外部匯流排 cpu訪問磁碟,鍵盤 i o裝置是系統與外界聯絡的通道 鍵盤滑鼠是輸入裝置,顯式器...

計算機系統組成 計算機系統的組成硬體系統1

計算機的系統組成,由軟體系統和硬體系統組成。對於硬體我們一般印象中的電腦機箱結構是下面這個樣子的 那從理論上來講乙個完整的計算機系統是由什麼組成的呢?我們換個思路來看看下面計算機系統的結構圖 今天我們從硬體開始為大家介紹計算機系統的各個知識點,在計算機所有硬體中最核心的硬體我們稱為 處理器,也就是我...