本文主要包括以下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)定義一個變量:創建一個變量,為其分配內存空間,並為它取名字(變量名),一個變量只能定義一次。