歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 【linux c】Linux c內存管理——你的數據放在哪_學習筆記_009

【linux c】Linux c內存管理——你的數據放在哪_學習筆記_009

日期:2017/3/3 11:26:31   编辑:Linux技術

本文主要包括以下6個知識點:計算機存數單位,各數據類型的字節長度,原碼和補碼,變量的三大特點,變量存儲以及內存分配,聲明和定義的區別。

1.計算機存儲單位計算機常用的存儲單位有 位、字節、半字、字。換算公式如下:

1個字節 = 8位

1個半字 = 2個字節

1個字 = 4個字節

2.各數據類型的字節長度(1)在不同編譯器中,給各數據類型分配的空間會有所不同,本文以linux為例,單位為字節。

①int 4

②short 2

③long 4

④long long 8

⑤float 4

⑥double 8

⑦char 1

(2)指針的存儲空間與普通類型不同,如下:

①int *

②short *

③long *

④long long *

⑤float *

⑥double *

⑦char *

以上所有類型的存儲空間均為4個字節

原因:每個指針保存的是地址,地址的長度是固定的,由操作系統確定。32bit的操作系統為4個字節,64bit的操作系統為8個字節。

3.原碼和補碼(1)原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值。比如如果是8位二進制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

原碼是人腦最容易理解和計算的表示方式。

(2)補碼

在計算機系統中,數值一律用補碼存儲。

為什麼用補碼來存儲呢,原因在於:

使用補碼,可以將符號位和其他位統一處理,減法也可按加法來處理;另外兩個用補碼表示的數相加時,如果最高位(有符號)有進位,則進位被捨棄(如char類型有8位,-128的補碼為1000 0000)。

(3)小結與計算(以下均以8位為例)

①正數的補碼與其原碼一致;

②負數補碼的符號位為1,其余位為該數絕對值的原碼取反,然後整個數加1。

③按照負數的補碼規則,可以知道,-1的補碼為0xff,-2的補碼為0xfe。

-128 -1

= -128 + (-1)

= 1000 0000 + 1111 1111

= 0111 1111

= 127

(4)補充知識點:

①常量為有符號位,~ 2 = -3。

②2的補碼:0000 0010;

取反後得:1111 1101,符號位為1,可知是負數;

符號位不動,其余為取反並加1,得 1000 0011,為-3。

4.變量三大特點:(1)變量的數據類型:主要說明變量占用內存空間的大小;

(2)變量的作用域:變量有效的使用范圍;

(3)變量存儲的類別:變量在內存中的存儲的方式,不同的存儲方式,影響變量在內存中的生存方式。

5.變量存儲以及內存分配:(1)初步理解:

打開程序,內存中就有了一個進程。對於進程來說,操作系統給每個進程都分配了4G的內存空間,但是進程不會用到4G的空間,實際用到的物理內存可能是20M。就好比1個人住在100平米的房間,而人每次活動實際占的空間只有1平米。

(2)內存空間的分配:

內存空間主要分為5段:內核段,棧空間,堆空間,數據段,代碼段。

棧空間:存放局部變量,函數形參,自動變量

堆空間:運行時可以動態分配的內存區域,通過 malloc, ralloc,calloc,free等庫函數,可以在運行期間向系統申請一段內存,申請到的內存空間就位於堆區上。

數據段:·未初始化的全局變量.bss:存放沒有初始化和初始化為0的全局變量。

·常量數據.rodata:存放常量。

·初始化過的全局變量.data:(靜態數據區)初始化為非零的全局變量,static修飾的變量。

代碼段:代碼段保存源代碼的地址(代碼段的地址不可以修改)。

(3)棧空間和堆空間的特點:

棧空間:①先進後出(最先輸入的數據最後釋放),管理權限是系統。

②若變量未初始化,隨機分配一個垃圾值

堆空間:①先進先出,管理權限是用戶。

②若變量未初始化,則初始化為0;

6.聲明與定義的區別:(1)聲明一個變量:告知編譯器,這個名字(變量名)已經匹配在一塊內存上了,但是並未為其分配內存。

(2)定義一個變量:創建一個變量,為其分配內存空間,並為它取名字(變量名),一個變量只能定義一次。

Copyright © Linux教程網 All Rights Reserved