複製鏈接
請複製以下鏈接發送給好友

16進制

鎖定
16進制:用16作為基數的計數系統。用數字0-9和字母a-f(或其大寫A-F)表示0到15。
用H表示十六進制
中文名
16進制
屬    性
用16作為基數的計數系統

目錄

16進制定義

16進制:用16作為基數的計數系統。用數字0-9和字母a-f(或其大寫A-F)表示0到15。
用H表示十六進制

16進制原理

16進制:用16作為基數的計數系統。用數字0-9和字母a-f(或其大寫A-F)表示0到15。
用H表示十六進制
十六進制數轉換成十進制數
2進制,用兩個阿拉伯數字:0、1;
8進制,用八個阿拉伯數字:0、1、2、3、4、5、6、7;
10進制,用十個阿拉伯數字:0到9;
16進制,用十六個阿拉伯數字……等等,印度人只發明瞭10個數字啊?
16進制就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這六個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
十六進制數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方……
所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。
..........................................................................................................
N進制的數可以用0---(N-1)的數表示,超過9的用字母A-F
例如:
10進制的32表示成16進制就是:20
16進制的32表示成10進制就是:3×16^1+2×16^0=50
例如:
10進制的32表示成16進制就是:20
16進制的32表示成10進制就是:3×16^1+2×16^0=50
6.1 為什麼需要八進制和十六進制?
編程中,我們常用的還是10進制……畢竟C/C++是高級語言。
比如:
int a = 100,b = 99;

16進制應用

由於數據在計算機中的表示,最終以二進制的形式存在,所以有時候使用二進制,可以更直觀地解決問題。
但,二進制數太長了。比如int 類型佔用4個字節,32位。比如100,用int類型的二進制數表達將是:
0000 0000 0000 0000 0110 0100
面對這麼長的數進行思考或操作,沒有人會喜歡。因此,C,C++ 沒有提供在代碼直接寫二進制數的方法。
用16進制或8進制可以解決這個問題。因為,進制越大,數的表達長度也就越短。不過,為什麼偏偏是16或8進制,而不其它的,諸如9或20進制呢?
2、8、16,分別是2的1次方,3次方,4次方。這一點使得三種進制之間可以非常直接地互相轉換。8進制或16進制縮短了二進制數,但保持了二進制數的表達特點。在下面的關於進制轉換的課程中,你可以發現這一點。
16進制就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這六個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
十六進制數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方……
所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。

16進制轉換方式

用豎式計算:
2AF5換算成10進制:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2 = 2560
第3位: 2 * 16^3 = 8192 +
-------------------------------------
10997
直接計算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997
(別忘了,在上面的計算中,A表示10,而F表示15)
現在可以看出,所有進制換算成10進制,關鍵在於各自的權值不同。
假設有人問你,十進數 1234 為什麼是 一千二百三十四?你儘可以給他這麼一個算式:
1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0
十六進制數的表達方法
如果不使用特殊的書寫形式,16進制數也會和10進制相混。隨便一個數:9876,就看不出它是16進制或10進制。
C,C++規定,16進制數必須以 0x開頭。比如 0x1表示一個16進制數。而1則表示一個十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區分大小寫。(注意:0x中的0是數字0,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此,我們學完了所有進制:10進制,8進制,16進制數的表達方式。最後一點很重要,C/C++中,10進制數有正負之分,比如12表示正12,而-12表示負12,;但8進制和16進制只能用達無符號的正整數,如果你在代碼中裏:-078,或者寫:-0xF2,C,C++並不把它當成一個負數。
6.2.7 十六進制數在轉義符中的使用
轉義符也可以接一個16進制數來表示一個字符。如在6.2.4小節中説的 \'?\' 字符,可以有以下表達方式:
\'?\' //直接輸入字符
\'\77\' //用八進制,此時可以省略開頭的0
\'\0x3F\' //用十六進制
同樣,這一小節只用於瞭解。除了空字符用八進制數 \'\0\' 表示以外,我們很少用後兩種方法表示一個字符。
二、十六進制數互相轉換
二進制和十六進制的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程序員都能做到看見二進制數,直接就能轉換為十六進制數,反之亦然。
我們也一樣,只要學完這一小節,就能做到。
首先我們來看一個二進制數:1111,它是多少呢?
你可能還要這樣計算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。
然而,由於1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值為23 = 8,然後依次是 22 = 4,21=2, 20 = 1。
記住8421,對於任意一個4位的二進制數,我們都可以很快算出它對應的10進制值。
下面列出四位二進制數 xxxx 所有可能的值(中間略過部分)
僅4位的2進制數 快速計算方法 十進制值 十六進值
1111 = 8 + 4 + 2 + 1 = 15 F
1110 = 8 + 4 + 2 + 0 = 14 E
1101 = 8 + 4 + 0 + 1 = 13 D
1100 = 8 + 4 + 0 + 0 = 12 C
1011 = 8 + 0 + 2 + 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 9 9
....
0001 = 0 + 0 + 0 + 1 = 1 1
0000 = 0 + 0 + 0 + 0 = 0 0
二進制數要轉換為十六進制,就是以4位一段,分別轉換為十六進制。
如(上行為二制數,下面為對應的十六進制):
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反過來,當我們看到 FD時,如何迅速將它轉換為二進制數呢?
先轉換F:
看到F,我們需知道它是15(可能你還不熟悉A~F這六個數),然後15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。
接着轉換 D:
看到D,知道它是13,13如何用8421湊呢?應該是:8 + 4 + 1,即:1101。
所以,FD轉換為二進制數,為: 1111 1101
由於十六進制轉換成二進制相當直接,所以,我們需要將一個十進制數轉換成2進制數時,也可以先轉換成16進制,然後再轉換成2進制。
比如,十進制數 1234轉換成二制數,如果要一直除以2,直接得到2進制數,需要計算較多次數。所以我們可以先除以16,得到16進制數:
被除數 計算過程 商 餘數
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4
結果16進製為: 0x4D2
然後我們可直接寫出0x4D2的二進制形式: 0100 1101 0010。
其中對映關係為:
0100 -- 4
1101 -- D
0010 -- 2
6.5 原碼、反碼、補碼
結束了各種進制的轉換,我們來談談另一個話題:原碼、反碼、補碼。
我們已經知道計算機中,所有數據最終都是使用二進制數表達。
我們也已經學會如何將一個10進制數如何轉換為二進制數。
不過,我們仍然沒有學習一個負數如何用二進制表達。
比如,假設有一 int 類型的數,值為5,那麼,我們知道它在計算機中表示為:
00000000 00000000 00000000 00000101
5轉換成二制是101,不過int類型的數佔用4字節(32位),所以前面填了一堆0。
現在想知道,-5在計算機中如何表示?
在計算機中,負數以其正值的補碼形式表達。
什麼叫補碼呢?這得從原碼,反碼説起。
原碼:一個整數,按照絕對值大小轉換成的二進制數,稱為原碼。
比如 00000000 00000000 00000000 00000101 是 5的 原碼。
反碼:將二進制數按位取反,所得的新二進制數稱為原二進制數的反碼。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。
反碼是相互的,所以也可稱:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。
補碼:反碼加1稱為補碼。
也就是説,要得到一個數的補碼,先得到反碼,然後將反碼加上1,所得數稱為補碼。
比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
那麼,補碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進制:0xFFFFFFFB。
再舉一例,我們來看整數-1在計算機中如何表示。
假設這也是一個int類型,那麼:
1、先取1的原碼:00000000 00000000 00000000 00000001
2、得反碼: 11111111 11111111 11111111 11111110
3、得補碼: 11111111 11111111 11111111 11111111
可見,-1在計算機裏用二進制表達就是全1。16進製為:0xFFFFFF。
一切都是紙上説的……説-1在計算機裏表達為0xFFFFFF,我能不能親眼看一看呢?當然可以。利用C++ Builder的調試功能,我們可以看到每個變量的16進制值。
本章小結
很難學的一章?
來看看我們主要學了什麼:
(1)我們學會了如何將二、八、十六進制數轉換為十進制數。
三種轉換方法是一樣的,都是使用乘法。
(2)我們學會了如何將十進制數轉換為二、八、十六進制數。
方法也都一樣,採用除法。
(3)我們學會了如何快速的地互換二進制數和十六進制數。
要訣就在於對二進制數按四位一組地轉換成十六進制數。
在學習十六進制數後,我們會在很多地方採用十六進制數來替代二進制數。
(4)我們學習了原碼、反碼、補碼。
把原碼的0變1,1變0,就得到反碼。要得到補碼,則先得反碼,然後加1。
以前我們只知道正整數在計算機裏是如何表達,我們還知道負數在計算機裏使用其絕對值的補碼錶達。
比如,-5在計算機中如何表達?回答是:5的補碼。