標籤:
上一講簡單介紹了常量和變數,這講補充一點電腦的基礎知識---進位。
我們先來看看平時是如何表示一個整數的,最常見的肯定是用阿拉伯數字表示,比如“十二”,我們可以用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-進位