本文旨在讓你掌握最基本的計算機進制及記憶體的知識,相信入門的朋友看完後大有幫助
因為部分排版原因電腦觀看效果最佳
文中開頭介紹部分有些啰嗦 可以點選目錄跳轉至對應地方觀看
關聯教程直達車-點選C語言入門知識串講跳轉
printf("感謝觀看!");
一、進制、程式設計語言的出現
首先我們為什麼要學進制?以及進制是什麼?
計算機進制是入門知識,也是必須了解的知識。相信大多數人就算不知道具體是什麼 也多少聽說過二進制之類的,至于具體是什麼,或許不知道,但就是在腦子裡有印象/doge
我們需要知道,計算機并不真是無比智能到你說啥它幹啥,不然還要程式員幹啥,它隻聽程式員的,換個說法就是,程式員能讓它聽他的,說到底也就是程式員掌握有與計算機交彙的語言,也就是常說的程式設計語言、彙編語言、二進制語言等,程式員就是通過掌握這些語言對計算機發送指令設計程式,讓計算機實作一系列操作。
這裡很令人好奇,為什麼計算機能識得這些語言,程式員寫的代碼,能實作那麼多不可思議的功能,什麼智能手機,人工智能等電子産品令人覺得匪夷所思...
下面帶你了解計算機的奇妙發展
目錄
一、進制、程式設計語言的出現
1. 0/1 基本原理
二、記憶體基本知識
1. 記憶體機理
2. 寄存器
三、常見的進制
1. 十進制
2. 二進制
3. 十六進制
四、常見記憶體操作
1. 原碼、補碼、反碼
2 . 移位、取反操作符
五、總結歸納
1. 0/1 基本原理
我們知道計算機隻是機器也就是鐵疙瘩,并不是有思想的人類能夠獨立思考,它的一切行為都是以人的意志為中心進行灌輸的,計算機的電路中所包含的資訊都來自電信号,而且為了友善地區分輸出的是高電壓和低電壓,早期的操作人員通過帶有孔的紙帶将程式輸入電腦進行編譯(對紙條打點),點代表1、0,即它其實隻能通過電流識别0、1,而二進制就是這樣由來的,是以0、1二進制是計算機的最基本單元,然後計算機科學家就通過這些編碼賦予了一定意義,這樣最早的二進制語言就實作了。
随着計算機的逐漸應用開發,人們逐漸意識到 純粹的 0、1編碼,多而繁瑣 根本不能輕易完成什麼重大的任務,後面出現了彙編語言,操作人員每人一個小冊子(指令小冊子),操作員對着冊子對計算機編碼,雖然這樣相比之前好得多但開發人員因為指令多而繁雜也是非常非常辛苦。是以計算機的發展迫切需要更加全面便捷的語言,也就是最初的A語言、B語言 發展至今的 C、JAVA、C#、C++、Python...等功能各異長處不同的語言
二、記憶體基本知識
在講進制方面的知識前,必須得提一下計算機記憶體,從之前的學習我們知道,我們講解各種資料類型的變量時用 sizeof () 操作符求了一下空間大小,由此可見,每個變量都占有一定的記憶體空間,我們這裡所說的記憶體到底指的是什麼?是不是和生活中買電腦時的8G/16G/32G記憶體有相應的關聯?硬碟、網盤也能存儲東西,在電腦上有何差别呢?
記憶體是計算機的運算空間,計算機裡面的所有計算都依賴記憶體進行,記憶體按運作速率低到高有 硬碟、記憶體、緩沖區、寄存器等 下面寄存器處會詳細講
在我們生活中 地球就相當于一個大的記憶體單元 存儲着所有的人類 人類被分布在每個國家 我們可以通過這個國家劃分的 省市縣鎮村等具體到找到每家每戶 并且每個人都有獨特的身份證号碼編号,同理 計算機會将自己的記憶體劃分成這麼多細小的單元 我們知道計算機還要進行各種複雜的運算 就像人類的實名制一樣 它也必須對每一個單元進行編号 編号後還要進行使用 因而它有效的空間就會顯得相形見绌 是以它必須進行更高效的記憶體管理機制
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxMGVOFzZq1UMVpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkjN2EzNzkDM0AzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
=> 當我們需要的時候 (比如定義變量) 它會随機租借給該變量一個空餘的記憶體單元--我們知道變量的大小機關是byte(下面會有為什麼最小機關是byte的推導過程), 而當使用完成之後(局部、全局變量)這個變量就會自動銷毀,重新釋放配置設定給它的記憶體空間以待其他需要空間的地方使用,而這就是變量 的 可行域生命周期的由來,原理就是 計算機高效便捷的記憶體管理機制
1. 記憶體機理
下面我們讨論下 計算機所配置設定的找到某個數值的編号是多少?以及為什麼資料類型定義的基本機關是 byte而不是更細小的bit,并且細化一下相關的運作機制
這裡将計算機記憶體裡面配置設定的空間編上号 相當于每個人的身份證号碼,這樣能快速找到對應的值,這些空間我們稱之為位址,而位址是怎麼産生以及表示的呢?
1.位址的産生配置設定
計算機有32/64位兩種作業系統,以32位為例,32位的系統裡面 有32根由 0/1構成的位址線,上面也有解釋到 計算機将電信号轉換成數字信号0/1這是我們與計算機交流的根本,32個序列由32個不同的 0/1排列構成一個特定的數一般用十、十六進制來表示(需要了解下面進制的轉換)
運用數學知識 0/1兩種情況 32個序列 共有 2^32 種情況 而每個小格子都有一個特定的位址,是以小格子也就是我們上面提到的位址就有2^32個,是以編号(位址)就是0-2^32 格子從頭排到尾,現在我們需要知道每個格子占用了多少的記憶體空間:
同理64位作業系統亦然
2. 位址的空間占用
已知 計算機裡面的基本機關及其換算 如下所示:
我們需要讨論一下每個格子占用了多少空間,這裡我們假設 2^32 個格子它每個格子占用了 1個bit 也就是
1. 2^32 個bit 位
2. 根據 下面圖中基本機關之間的換算 利用電腦
根據機關轉換計算所得,如果以bit作為每個位址的基本機關,那我們最終得到的隻有0.5G的使用記憶體
1. 若選用 bit 作機關 那我們知道 一個 char 就需要用掉8個格子(即用掉8個位址格子) int 需要用掉 32個格子 極大地造成了浪費 不合常理
2. 0.5G 的 空間 遠無法完成所需
我們通過計算得出bit作為基本機關是有問題的,那如果我們換成byte作為基本機關,那在bit的基礎上 乘 8 則,我們可用的 約 4GB的記憶體
1. 如果我們換成 byte作為基本機關,char 隻需要1個格子就行 int 也隻需要 4個格子
2. 能使用4G空間 滿足基本所需
3. 而至于如 KB作基本機關 char 就隻需要 XX分之一個格子就行,格子是獨有的 不是共有的 這樣會造成紊亂 不符實際
3. 位址的表示方法
位址我們常用表示它的編号的方法就是它 二 進制序列對應的 十六進制數字 即 二進制轉0/1序列到 十 進制然後再轉到十六進制,形如 0x00AFFC94 由0x先開頭的就是十六進制,這裡結合下面進制轉換的内容觀看
而16進制是二進制的簡寫形式 我們知道 一個int變量都有32個序列 那樣寫出來隻會讓人眼花缭亂 是以規定了16進制表示法 1個 十六進制數 等于 4個二進制序列 是以本來寫32個數 而對應的轉換規則就是 将對應的十六進制數用對應4個二進制序清單示出來(很多人不了解這個轉換規則,這個在下面16進制與2進制之間轉換會詳細講) 現在隻需要寫8個數就能解決 極大地進行了簡化 ,是以這裡隻是表達方式不一樣罷了 我們可以通過這些位址準确找到我們需要找到的變量等
=> 取位址
而我們知道 既然int 之類的記憶體配置設定需要四個格子 每個格子都有編号 ,故而規定了以開頭的(小的)為它存儲的位址,也就是說當我們取 int位址的時候,取到的會是所配置設定的四個格子裡面最小的一個 如 6A 6B 6C 6D(十六進制表示) 先取6A 其他的通過依次加就能推出來
是以其取得的位址就是
這裡在後面十六進制裡面會有舉例證明
2. 寄存器
寄存器是類似于記憶體一樣的空間 與之類似的有 網盤 硬碟 記憶體 高速緩沖區 寄存器 它們的存儲空間依次減少 但是運作效率越來越快,而運作效率是由CPU中央處理器運作的速度決定的的,早期的時候資料存儲在記憶體裡面,CPU在記憶體裡面拿資料進行運算,兩者的速度差不了太多,随着計算機的發展 CPU的運作效率變得越來越快 以至于記憶體已經滿足不了計算機,是以規定了 運作速率更快但記憶體含量更低的 高速緩沖區和寄存器(造價更高),每次隻需要将其他地方的資料推送到寄存器 保證每時CPU都能在寄存器裡面拿到資料進行運算,這樣下來整體的效率就提了上來,它們之間基本關系如圖所示:
三、常見的進制
二進制構成了整個計算機體系,我們平時生活學習使用的數字都是十進制 生活中的數都由0-9構成注意不是0-10,是以平時基本看不到 0、1序列的表示,也就是說在計算機裡面也對應有相應的轉換規則,通過這些轉換規則将0、1序列轉換成使我們能夠了解的,即轉換成字元的形式(鍵盤上的都是字元)
下面我們來看一張表:
可以看見 我們平時看見的字元,一些符号、字母 在計算機裡面都規定了各自的十進制數字,進而計算機隻需要将這些十進制轉化成對應字元就能夠讓人讀懂,我們鍵盤上的字元也是對應的ASCII 碼表,比如 這裡列印 字母 Z 及其 十進制數
這裡我們介紹一下 常見的進制 以及它們之間的互相轉換
二進制 | 十進制 |
---|---|
互相轉換 | 十六進制 |
進制轉換就是進制之間互相轉化,計算機就是通過進制的轉換過程變得讓人們易于了解和程式設計,我們平時有時候接觸進制的時候總是迷迷糊糊的也不知道人怎麼 一會 2^n、一會兒 16^n 到底怎麼回事,現在就來詳細講講 它們間的轉換
1. 十進制
十進制: 由 0~9的數字組成 生活中所使用的阿拉伯數字 就是 由0~9構成的,其中 逢10進位 10^n為權 基數為 10
通過這個例子能直覺的看出權 和基數的含義是什麼
我們這裡肯定會疑問 各自基數上的次方數如何得到,并且最終結果是 所有權的累加值,其運算機理如圖所示,其他進制方法亦然
該圖示的方法是轉化為10進制的方法 下面示例中角标是幾就代表幾進制
2. 二進制
二進制:剛剛提過二進制就是最基本的 0/1 序列 由 0/1組成 逢2進位 2^n 為權 基數是 2
3. 十六進制
十六進制: 由 0 ~ 9 A BCDEF 共十五位字元表示 1~15 逢16進位 16^n為權 基數16
十六進制是二進制的簡寫 友善專業的人員進行書寫進制資料,其中十六進制的1位數 等于 二進制的 4位數 它們之間的轉化遵循 十進制與二進制的轉換
用面(5E)舉例 這裡 我們将(5E)拆寫成 (5 14)然後分别寫出5 和 14的 4位二進制序列 這便是 十六進制與二進制的轉換機理 下面也會細講
也許在我們學習過程中你會發現 程式調試起來後 記憶體視窗出現的 那些個 0x00AFFC94 好像就是這樣 字母數字的 我們來看看,結合之前所講到的記憶體知識
分析下圖:
1. 我們看到系統中記憶體存在形式是更為簡便的十六進制表示方法
2. 圖示 int 定義的 a 是四個位元組的 取位址偏偏取了 0a D8 後面 00 00 00 的部分分别是 D9 DA DB 3. 是以知道 取位址的時候預設的由低到高,取最低的作為位址 其他可以往上加得到,每次調試位址可能是變化的 是因為記憶體随機配置設定的緣故
十六進制與二進制之間的轉換 :無非就遵循上面規則 1個十六進制的數 等于 4個二進制序列 我們隻需要将十六進制對應的每個數字轉換為對應的4個二進制序列就行
1.比如下面 十六進制的 (41) 拆開 (4 1)然後再 寫出 4 / 1對應的 4個二進制序列 0100 0001 最後就是它的二進制表示就是(01000001)
2. 十六進制(D6)寫成拆開的 (D 6)然後 轉化為 十進制數字形式 D對應十進制 13( 13 6 )
寫出 13 / 6 對應的4位二進制序列 13 --1101 / 6 --- 0110 最後 (11010110)即為所求
學到這裡上面ASCII表的基本運作機理 你應該已經了然于胸 無非就是規定一些字元(普通人能直覺看懂的符号)然後每個字元都對應相應的 10進制數字 然後 計算機隻需要将這些10進制數字轉換成2進制數字 就能完成與計算機之間的基本互動,而10進制到2進制的轉換我們初學做個了解就行
4. 高進制到低進制之間的轉換
前面我們已近熟悉過了 各個進制到 10進制之間的轉換 —— 各自權的和
而由高進制 10/16 到 2 進制之間 轉換 我們隻需要 除以相應的 基數 取餘數 當商0時不再除基數 然後所有餘數進行倒序排列就是對應轉換後的數
用圖來表示就是
16 進制與 2進制之間 轉換就不用說了 剛才已說過 兩者隻是不同的表示形式
作為了解這個知識隻需要熟練掌握 10進制轉化成2進制的數 簡單的将數字轉化為對應二進制序列
四、常見記憶體操作
1. 原碼、補碼、反碼
整數在計算機裡面有原碼、反碼、補碼三種存儲方式
整數是以二進制的形式存儲的(從上面介紹就可以知道)
有符号的整數二進制得最高位 0 表示正數 1表示負數
計算機裡面規定了
正數的源碼 補碼 反碼都是一樣的
我們在分析一個變量的二進制序列時 要注意看它的類型 不同的類型得到的 bit 位是不同的 比如下面以int舉例
負數的 原碼 反碼 補碼 需要計算得到
計算機裡面存儲整數時存儲的是補碼,計算時也用的是補碼
2 . 移位、取反操作符
接 C語言入門知識串講 裡面的操作符内容–移位及取反操作符
注意:這裡所有的按位 都是指按二進制位 最好将上面的二進制轉換的知識跟着算一遍會更加輕松
- 位操作符 ( &、 | 、^)
按位與 &
按位或 |
按位異或 ^
用數學中的 真1假0 命題 來助記就是
1. 按位與 & 有一個是假命題就是假命題
2. 按位或 | 有一個真命題就是真命題 全為假命題才是假命題
3. 按位異或 ^ 命題相同就是假命題 命題相異就是真命題
- 左移操作符(右移的原理一樣 向右移動 空缺的部分用 0 補位)
- 取反操作符
五、總結歸納
1.通過上面的例子我們可以了解到 基本的 進制之間的轉換 2-10-16 而較為難見到的 8進制之類的就不做論述
2.我們隻需要了解介紹的基本的 換算 二進制 十進制 十六進制之間的 轉換在涉及記憶體序列這些的時候就不會太懵
3.這裡的學習對于指針的進一步了解會有很大的幫助
4.可以點選C語言入門知識串講跳轉
待補充… …
碼字不易,給個三連可好!!!
看到這,希望投點寶貴的意見,并且能夠從其中學到對你有用的知識