記憶體及資料儲存
gcc的使用
1.計算機能識別的唯一語言是計算機語言
語言的發展:
機器語言 |
二進位制資料,11010101 |
組合語言 |
用符號表示一組操作 add call mov 直接操作硬體速度快 |
高階語言 |
以語句為單位進行操作 ===> 可移植 |
C語言是中級語言,具體彙編的特性,同時也具備高階語言可移植等特性。
不管什麼語言,要想被計算機執行,必須轉換成機器碼
編譯器:將原來的程式碼(原始碼)編譯成
相同的程式碼經過不同的編
譯器編譯,可以被不同的裝置所執行
Linux系統常用的編譯C語言的編譯器是:gcc
2.C語言程式便宜步驟
預處理(預編譯) |
處理 “#” 開頭的內容,進行替換、去掉註釋。。。。s |
生成預處理檔案,字尾名是 .i |
編譯 |
編譯器對程式碼進行編譯 ----> 最複雜.耗時最長的過程 |
生成彙編檔案,字尾名.s |
彙編 |
把彙編檔案編譯二進位制目標檔案 |
生成目標檔案,字尾名是.o |
連結 |
把多個目標檔案按照一定規則整合成一個可以執行的程式 |
生成的是最終的可以執行的程式 |
3.gcc的命令
gcc -E |
對檔案進行預處理,生成預處理檔案 |
gcc -S |
對檔案進行編譯,生成彙編檔案 |
gcc -c |
對檔案進行彙編,生成目標檔案 |
gcc -o |
給生成的檔案重新命名 |
gcc 預設生成的檔案 檔名是 a.out
如果想自定義生成的檔名,編譯的時候加 -o 後面加名字
4.程式執行
./a.out |
./不是命令,是當前路徑的寫法,代表當前目錄 |
/mnt/hgfs/code/171/4/a.out |
絕對路徑寫法 |
記憶體
程式:
1、沒有執行的程式 |
就是一堆程式碼,存在儲存裝置中,比如:硬碟、U盤、手機…. |
2、執行起來的程式 |
程式會被讀到記憶體中執行,記憶體中存改程式的可執行程式碼、資料…. |
儲存單位:
1、bit |
位,位元,是一個二進位制數字,只能表示 0 或者 1,使用的單位是 b |
2、Byte |
位元組,使用的單位是 B 1B = 8b ====> 是記憶體的最小儲存單位 |
3、KB |
1KB = 1024B |
4、MB |
1MB = 1024KB |
5、GB |
1GB = 1024MB |
記憶體最小的儲存單位是位元組,如何管理?
記憶體為每個位元組分配了一個編號,類似於人的身份證號 ===> 這個編號叫做記憶體的地址
編號? ===> 是一個數字 ====> 是否有範圍??
記憶體為位元組分配編號,要統一編號,這個編號的位數也是固定的
1、32位系統 |
編號的位數是32位 進位制是二進位制 000001…… 10101010(32個) ==> 4B |
2、64位系統 |
編號的位數是64位 進位制是二進位制 000001…… 10101010(64個) ==> 8B |
32位系統 ===> 記憶體編號是4位元組編號 ====> 最大能有多少個位元組?
範圍: 0000…00000(32個0) -----> 1111….1111(32個1)
0 -----> 2的32次方-1
總共 2的32次方個位元組===4GB
資料儲存
記憶體存的是二進位制資料,以1個位元組為例:
1.無符號數:只有正數,不帶正負號
範圍: 0000 0000 -----> 1111 1111
0 -------> 255
2.有符號數:帶正負號的數
記憶體取最高位為符號位
最高位 |
型別 |
0 |
正數 |
1 |
負數 |
存:
正數在記憶體中的存的資料本身
負數:先轉換成二進位制,對每一位取反(符號位不變),然後加1
比如:
5: 實際在記憶體中存的值是 0000 0101
-5: 1000 0101(-5) ===> 1111 1010(取反) ===> 1111 1011(+1)
實際在記憶體中存的值是 1111 1011
0在記憶體中表示 :0000 0000
-0在記憶體中表示:人為規定 -0 就是 -128
就是說 1000 0000 這個值表示 -128
有符號數取值範圍:1000 0000 ---- 01111 1111
-128 ---- 127
有符號數,在一個位元組範圍內:
127+1
127在記憶體中的儲存: 0111 1111
1 在記憶體中的儲存: 0000 0001
和:1000 0000====》-128
1111 1111 代表 -1