【零基礎學習iOS開發】【02-C語言】05-進位

來源:互聯網
上載者:User

標籤:

上一講簡單介紹了常量和變數,這講補充一點電腦的基礎知識---進位。

我們先來看看平時是如何表示一個整數的,最常見的肯定是用阿拉伯數字表示,比如“十二”,我們可以用12來表示,其實這種表示方式是基於一種叫做“十進位”的計數方式。“進位”是一種計數方式,編程中常見的進位有4種:十進位、二進位、八進位、十六進位。也就是說,同一個整數,我們至少有4種表示方式。

 一、十進位1.概念

十進位是我們最熟悉、最常用的一種計數方式,它有兩個特點:由0、1、2….9十個基本數字組成;運算規則是“逢十進一”。

 

2.運算

所謂“逢十進一”,似乎在小學數學中都已經學過了,也就是當數值滿十時,就要向前進一位

個位元為9+1,滿十了,十位元就進一。

 

回到頂部二、二進位1.概念

二進位是電腦內部使用的一種計數方式,它有兩個特點:由0、1兩個基本數字組成;運算規則是“逢二進一”。

 

2.細節

1> 有人可能會問:為什麼二進位裡面沒有2~9這些數字呢?都說了,逢二進一,因此當數字滿二的時候就會進位。

2> 如果我寫個1010,你能看出它是二進位還是十進位嗎?為了跟其他進位區分開來,書寫位元的時候,需要以0b或者0B開頭。比如0b1010是個位元,而1010則還是我們熟悉的十進位數,就是“一千零一十”

 

3.運算

做個簡單的運算吧,比如1+1

個位元是1+1,值滿二了,於是十位元要進一。因此,在二進位中:1 + 1 = 0b10,這裡的0b10表示的是十進位中的“二”,並不是“十”。

 

以此類推,11 + 1 = 0b100

 

 

4.二進位轉為十進位

1> 用二進位表示數值,雖然簡單、方便,但是不容易閱讀,比如隨便給出個位元0b110111101010,你能立刻看出它表示的是什麼數值嗎?一般需要將位元轉為十進位數後才能知道代表的什麼數值。

進位裡面有個“基數”的概念,基數是用來計算數值的,比如十進位的基數是10,因此十進位是這樣算數的:

1230 = 0 * 100 + 3 * 101 + 2 * 102 + 1 * 103 = 0 * 1 + 3 * 10 + 2 * 100 + 1 * 1000

二進位的基數是2,以此類推:

0b1011 = 1 * 20 + 1 * 21 + 0 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 1 + 2 + 0 + 8 = 11

因此位元0b1011表示的數值是十進位中的11

 

2> 一位位元能表示的最大值是1,而n位位元所能表示的最大值是0b111...1111,也就是說n位位元都是1,那麼它的十進位數值為:

1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 + .... + 1 * 2n-1 = 2n - 1

因此,n位位元所能表示的最大值是2n - 1。也就是說,4位位元能表示的最大值是0b1111,十進位數值為:24 - 1 = 15;5位位元能表示的最大值是25 - 1 = 31。

 

回到頂部三、八進位1.概念

八進位有兩個特點:由0~7八個基本數字組成;運算規則是“逢八進一”。

 

2.細節

由於十進位和八進位中都包含了0~7,為了區分開來,在書寫八位元的時候,需要在前面加個0。比如076是個八位元,76則是個十進位數。

 

3.運算

個位元是7+1,值滿八了,於是十位元要進一。因此,在八進位中,7 + 1 = 010。010則表示十進位中的“八”,而不是“十”

 

4.八進位轉十進位

八進位的基數是8,因此027計算出來就是十進位中的23

027 = 7 * 80 + 2 * 81 = 7 * 1 + 2 * 8 = 23

 

5.二進位轉八進位

不難發現一個十進位數可以表示的最大值是9,而一個八位元可以表示的最大值是7,恰好3個位元可以表示的最大值0b111也是7。因此,我們可以用一個八位元來代替3個位元。

0b11110011 = 0b 011  110  011  = 0363

如果是八進位轉為二進位,那就反過來,用3位位元來表示1位八位元

025 = 0b 010  101 = 0b10101

 

回到頂部四、十六進位1.概念

十六進位有兩個特點:由0~9和A~F組成,A~F分別表示10~15;運算規則是“逢十六進一”。

 

2.細節

由於十進位、八進位、十六進位中都包含了0~7,為了區分開來,在書寫十六進位數的時候,需要在前面加個0x或者0X。比如0x76是個十六進位數,076是個八位元,76則是個十進位數。

 

3.運算

個位元是B+5,也就是11+5,值滿十六了,於是十位元要進一。因此,在十六進位中,B + 5 = 0x10。0x10則表示十進位中的“十六”,而不是“十”

 

4.十六進位轉十進位

十六進位的基數是16,F表示十進位中的15,因此0x2F計算出來就是十進位中的47

0x2F = 15 * 160 + 2 * 161 = 15 * 1 + 2 * 16 = 47

 

5.二進位轉十六進位

一個十六進位數可以表示的最大值是15,恰好4個位元可以表示的最大值0b1111也是15。因此,我們可以用一個十六進位數來代替4個位元。

0b11110011 = 0b 1111  0011  = 0xF3

如果是十六進位轉為二進位,那就反過來,用4位位元來表示1位十六進位數

0x25 = 0b 0010  0101=0b100101

 

回到頂部五、進位總結

1.一個整數“十二”的4種表示方式分別如下:

十進位:12

二進位:0b1100

八進位:014

十六進位:0xC

 

2.其實也可以利用Mac中的計算機軟體來測試進位之間的轉換。

設定電腦的顯示模式為“編程器”

先選擇10進位,然後輸入12,底部顯示的位元為1100,這裡省略最前面的0b

選擇八進位,顯示為14,這裡省略了最前面的0

選擇十六進位,顯示為0xC

 

回到頂部六、變數與進位

1.上一講學習了變數的使用,簡單回顧一下

1 int main()2 {3     int a = 10;4     return 0;5 }

在第3行定義了一個變數a,儲存的是十進位整數10。其實,這個變數a在記憶體中是以位元的形式儲存的,10的二進位形式是1010。

 

2.除了十進位整數,還可以將其他進位的整數賦值給整型變數

 1 int main() 2 { 3     int a = 0b110; // 十進位數:6 4      5     int b = 021; // 十進位數:17 6      7     int c = 12; // 十進位數:12 8      9     int d = 0x1D; // 十進位數:2910     11     return 0;12 }

上面的代碼中,分別將4種不同進位的數值賦值給不同的整型變數。對應的十進位數值已經寫在右邊的注釋中。它們最終都是以二進位的形式儲存在記憶體中。

 

回到頂部七、printf的簡單使用1.用printf輸出整型變數

前面給變數賦值了各種進位的整數,究竟這些整數的十進位形式為多少呢?我們自己可以換算出來,不過總是自己去算,太麻煩了,我們可是程式員,應該利用程式幫我們算出來。前面已經學過printf("Hello World");語句的作用是在螢幕輸出Hello World這一串內容。我們其實也可以利用printf將一個變數輸出到螢幕,看看這個變數的值究竟為多少。

這個printf看起來好像是你往它的小括弧裡面放什麼內容,它就會在螢幕上輸出什麼內容,但是printf的用法有講究的,像下面的寫法就是錯誤的:

 1 #include <stdio.h> 2  3 int main() 4 { 5     int a = 0x1D; 6      7     printf(a); 8      9     return 0;10 }

有人可能會疑惑,為什麼有時需要#include <stdio.h>,有時又不需要#include <stdio.h>?這個暫時不去詳細討論,你先記住只要用了printf,就要添加#include <stdio.h>。

在第5行定義了變數a,初值為一個十六進位數。在第7行想通過printf輸出變數a的數值,但是第7行的寫法是錯誤的。 要想利用printf輸出一個整型變數,就必須先說明輸出的格式,比如是以十進位格式輸出還是以八進位格式輸出?

 

下面的寫法才是正確的:

 1 #include <stdio.h> 2  3 int main() 4 { 5     int a = 0x1D; 6      7     printf("變數a的值為%d", a); 8      9     return 0;10 }

注意看第7行,左邊雙引號括住的內容代表著要輸出到螢幕的內容,不過並不是直接將 "變數a的值為%d" 輸出到螢幕。%d是一種格式符,它的意思是用右邊變數a的值替代%d的位置進行輸出,並且以十進位格式輸出。說白了,格式符是用來控制輸出格式的。

程式在終端上的運行結果是:

可以發現,輸出了"變數a的值為29",0x1D的十進位數值確實是29,說明這個輸出是正確的。但是這個29跟後面的英文連在一起了,非常難看,這時候我們可以在%d的後面加一個\n表示斷行符號換行。

 1 #include <stdio.h> 2  3 int main() 4 { 5     int a = 0x1D; 6      7     printf("變數a的值為%d\n", a); 8      9     return 0;10 }

注意第5行的改變:在%d的後面加了個\n,表示將變數a以十進位格式輸出後進行斷行符號換行。

這時候的運行結果是:

這樣就可以明顯地看到這個29了

 

2.printf支援的格式符

除開%d,printf還支援很多格式符,如下表所示(紅色表示常用),這份表格的內容不用去死記,用到時再回來查資料即可

接下來簡單示範一下%x的使用,它的功能是以十六進位形式輸出整數

 1 #include <stdio.h> 2  3 int main() 4 { 5     int a = 17; 6      7     printf("%x\n", a); 8      9     return 0;10 }

在第5行定義了變數a,儲存的是十進位整數17,在第7行讓變數a以十六進位形式輸出,運行結果是:

可以發現,十進位整數17以十六進位形式輸出就是11,這是正確的。

 

3.printf可以同時輸出多個數值

看下面代碼,利用printf同時輸出多個數值

 1 #include <stdio.h> 2  3 int main() 4 { 5     int age = 17; 6      7     int no = 10; 8      9     printf("age = %d, no = %d\n", age, no);10     11     return 0;12 }

注意看第9行,左邊的雙引號內有2個%d,age的值會代替第一個%d進行輸出,no的值會代替第二個%d進行輸出,並且都是以十進位形式輸出。輸出結果:

 

4.printf也可以輸出常量
1 #include <stdio.h>2 3 int main()4 {5     6     printf("輸出的常量為%d\n", 11);7     8     return 0;9 }

注意第6行,右邊的是一個整型常量11,它會代替%d的位置進行輸出。輸出結果:

用了半天,似乎還是沒有說到printf究竟是個什麼東西,這個會放到後面詳細討論,它還有其他複雜用法。

【零基礎學習iOS開發】【02-C語言】05-進位

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.