十六進制

十六進制

十六進制(英文名稱:Hexadecimal),是計算機中數據的一種表示方法。同我們日常生活中的表示法不一樣。它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關係是:0-9對應0-9;A-F對應10-15;N進制的數可以用0~(N-1)的數表示,超過9的用字母A-F。

基本信息

十六進制的表示方法

十六進制照樣採用位置計數法,位權是16為底的冪。對於n位整數,m位小數的十六進制數用加權係數的形式表示如下:

十六進制十六進制

舉例說明

16進制的20表示成10進制就是:2×16¹+0×16º=32

10進制的32表示成16進制就是:20

十進制數可以轉換成十六進制數的方法是:十進制數的整數部分“除以16取余”,十進制數的小數部分“乘16取整”,進行轉換。

比如說十進制的0.1轉換成八進制為0.0631463146314631。就是0.1乘以8=0.8,不足1不取整,0.8乘以8=6.4,取整數6, 0.4乘以8=3.2,取整數3,依次下算。

編程中,我們常用的還是10進制.畢竟C/C++是高級語言。

比如:

int a = 100,b = 99;

不過,由於數據在計算機中的表示,最終以二進制的形式存在,所以有時候使用二進制,可以更直觀地解決問題。但二進制數太長了。比如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進制縮短了二進制數,但保持了二進制數的表達特點。在下面的關於進制轉換的課程中,你可以發現這一點。

轉換

二進制轉換十進制

二進制數第0位的權值是2的0次方,第1位的權值是2的1次方……

所以,設有一個二進制數:101100100,轉換為10進制為:356

用橫式計算

0×2+0×2+1×2+0×2+0×2+1×2+1×2+0×2+1×2=356

0乘以多少都是0,所以我們也可以直接跳過值為0的位:

1×2+1×2+1×2+1×2=356

4+32+64+256 =356

八進制轉換十進制

八進制就是逢8進1。

八進制數採用 0~7這八數來表達一個數。

八進制數第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……

所以,設有一個八進制數:1507,轉換為十進制為:839,具體方法如下:

可以用橫式直接計算:

7×8+0×8+5×8+1×8=839

也可以用豎式表示

第0位 7×8=7

第1位 0×8=0

第2位 5×8=320

第3位 1×8=512

十六進制轉換十進制

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開始)位上,如果是數β (β大於等於0,並且β小於等於 15,即:F)表示的大小為 β×16的N次方。

假設有一個十六進數 2AF5

直接計算就是:

5×16+F×16+A×16+2×16=10997

也可以用豎式表示:

第0位: 5×16=5

第1位: F×16^1=240

第2位: A×16=2560

第3位: 2×16=8192

-------------------------------

10997

此處可以看出,所有進制換算成10進制,關鍵在於各自的權值不同。

假設有人問你,十進數1234 為什麼是一千二百三十四?你盡可以給他這么一個算式:

1234 = 1×10+2×10+3×10+4×10

十六進制互相轉換

首先我們來看一個二進制數:1111,它是多少呢?

你可能還要這樣計算:1×2+1×2+1×2+1×2=1×1+1×2+1×4+1×8=15。

然而,由於1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值為2=8,然後依次是 2=4,2=2,2=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進制為:4D2

然後我們可直接寫出4D2的二進制形式:

0100 1101 0010

其中對映關係為:

0100 -- 4

1101 -- D

0010 -- 2

同樣,如果一個二進制數很長,我們需要將它轉換成10進制數時,除了前面學過的方法是,我們還可以先將這個二進制轉換成16進制,然後再轉換為10進制。

下面舉例一個int類型的二進制數:

01101101 11100101 10101111 00011011

我們按四位一組轉換為16進制:6D E5 AF 1B

十進制轉十六進制

十六進制十六進制

采餘數定理分解,例如將487710轉成十六進制:

487710÷16=30481....14(E)

30481÷16=1905....1

1905÷16=119....1

119÷16=7....7

7÷16=0....7

這樣就計到487710(10)=7711E(16)

表達方法

程式的表達方法環境 格式備註URL%hex無 XML,XHTML&#xhex無HTML,CSS#hex6位,表示顏色UnicodeU+hex6位,表示字元編碼MIME=hex無Modula-2#hex無Smalltalk,ALGOL 6816rhex無Common Lisp#xhex或#16rhex無IPv68個hex用:分隔無

C C++的表達方法

如果不使用特殊的書寫形式,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++並不把它當成一個負數。

在轉義符中的使用

轉義符也可以接一個16進制數來表示一個字元。如 \'?\' 字元,可以有以下表達方式:

\'?\' //直接輸入字元

\'\77\' //用八進制,此時可以省略開頭的0

\'\0x3F\' //用十六進制

同樣,這一小節只用於了解。除了空字元用八進制數 \'\0\' 表示以外,我們很少用後兩種方法表示一個字元。

各碼轉換

結束了各種進制的轉換,我們來談談另一個話題:原碼、反碼、補碼。

我們已經知道計算機中,所有數據最終都是使用二進制數表達。

我們也已經學會如何將一個10進制數如何轉換為二進制數。

不過,我們仍然沒有學習一個負數如何用二進制表達。

比如,假設有一 int 類型的數,值為5,那么,我們知道它在計算機中表示為:5

00000000 00000000 00000000 00000101

轉換成二制是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進制為:0xFFFFFFFF。

一切都是紙上說的……說-1在計算機里表達為0xFFFFFFFF,我能不能親眼看一看呢?當然可以。利用C++ Builder的調試功能,我們可以看到每個變數的16進制值。

變數

下面我們來動手完成一個小小的實驗,通過調試,觀察變數的值。

我們在代碼中聲明兩個int 變數,並分別初始化為5和-5。然後我們通過CB提供的調試手段,可以查看到程式運行時,這兩個變數的十進制值和十六進制值。

首先寫一個如下的C語言控制台程式:

設定斷點:最常用的調試方法之一,使程式在運行時,暫停在某一代碼位置,

在Code::Blocks中,設定斷點的方法是在某一行代碼上按F5或在行首欄內單擊滑鼠。

我們在return 0;這一行上設定斷點。斷點所在行將被Code::Blocks以紅色顯示。

接著,運行程式(F9),程式將在斷點處停下來。

(請注意兩張圖的不同,前面的圖是運行之前,後面這張是運行中,左邊的箭頭表示運行運行到哪一行)

當程式停在斷點的時,我們可以觀察當前代碼片段內,可見的變數。觀察變數的方法很多種,這裡我們學習使用 Debug Inspector (調試期檢視),來全面觀察一個變數。

以下是調出觀察某一變數的Debug Inspector視窗的方法:

先確保代碼視窗是活動視窗。(用滑鼠點一下代碼視窗)

按下Ctrl鍵,然後將滑鼠挪到變數 aaaa 上面,你會發現代碼中的aaaa變藍,並且出現下劃線,效果如網頁中的超連結,而滑鼠也變成了小手狀:

點擊滑鼠,將出現變數aaaa的檢視視窗。

從該視窗,我可以看到:

aaaa :變數名

int :變數的數據類型

0012FF88:變數的記憶體地址,請參看5.2 變數與記憶體地址;地址總是使用十六進制表達

5 :這是變數的值,即aaaa = 5;

0x00000005 :同樣是變數的值,但採用16進制表示。因為是int類型,所以占用4位元組。

首先先關閉前面的用於觀察變數aaaa的Debug Inspector視窗。

然後,我們用同樣的方法來觀察變數bbbb,它的值為-5,負數在計算機中使用補碼錶示。

正如我們所想,-5的補碼為:0xFFFFFFFB。

再按一次F9,程式將從斷點繼續運行,然後結束。

總結

很難學的一章?

來看看我們主要學了什麼:

1、我們學會了如何將二、八、十六進制數轉換為十進制數。

三種轉換方法是一樣的,都是使用乘法。

2、我們學會了如何將十進制數轉換為二、八、十六進制數。

方法也都一樣,採用除法。

3、我們學會了如何快速的地互換二進制數和十六進制數。

要訣就在於對二進制數按四位一組地轉換成十六進制數。

在學習十六進制數後,我們會在很多地方採用十六進制數來替代二進制數。

4、我們學習了原碼、反碼、補碼。

把原碼的0變1,1變0,就得到反碼。要得到補碼,則先得反碼,然後加1。

以前我們只知道正整數在計算機里是如何表達,這時我們還知道負數在計算機里使用其絕對值的補碼錶達。

比如,-5在計算機中如何表達?回答是:5的補碼。

5、最後我們在上機實驗中,這會了如何設定斷點,如何調出Debug Inspector視窗觀察變數。

以後我們會學到更多的調試方法。

標準表示

在數制使用時,常將各種數制用簡碼來表示:如十進制數用D表示或省略;二進制用B來表示;十六進制數用H來表示。

如:十制數123表示為:123D或者123;二進制數1011表示為:1011B;十六進制數3A4表示為:3A4H。

另外在編程中十六進制數也用“0x”作為開頭。

意義

用於計算機領域的一種重要的數制。

對計算機理論的描述,計算機硬體電路的設計都是很有益的。比如邏輯電路設計中,既要考慮功能的完備,還要考慮用儘可能少的硬體,十六進制就能起到一些理論分析的作用。比如四位二進制電路,最多就是十六種狀態,也就是一種十六進制形式,只有這十六種狀態都被用上了或者儘可能多的被用上,硬體資源才發揮了儘可能大的作用。

十六進制更簡短,因為換算的時候一位16進制數可以頂4位2進制數。

你可以在二進制前加幾個0,意義不變。

二進制 八進制 十進制 十六進制
0 1 0 1 0 1 0 1
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 A
1011 13 11 B
1100 14 12 C
1101 15 13 D
1110 16 14 E
1111 17 15 F
10000 20 16 10
10001 21 17 11
10010 22 18 12
10011 23 19 13
10100 24 20 14
10101 25 21 15
10110 26 22 16
10111 27 23 17
11000 30 24 18
11001 31 25 19
11010 32 26 1A
11011 33 27 1B
11100 34 28 1C
11101 35 29 1D
11110 36 30 1E
11111 37 31 1F
100000 40 32 20
100001 41 33 21
100010 42 34 22
100011 43 35 23
100100 44 36 24
100101 45 37 25
100110 46 38 26
100111 47 39 27
101000 50 40 28
101001 51 41 29
101010 52 42 2A
101011 53 43 2B
101100 54 44 2C
101101 55 45 2D
101110 56 46 2E
101111 57 47 2F
110000 60 48 30
110001 61 49 31
110010 62 50 32
110011 63 51 33
110100 64 52 34
110101 65 53 35
110110 66 54 36
110111 67 55 37
111000 70 56 38
111001 71 57 39
111010 72 58 3A
111011 73 59 3B
111100 74 60 3C
111101 75 61 3D
111110 76 62 3E
111111 77 63 3F
1000000 100 64 40
1000001 101 65 41
1000010 102 66 42
1000011 103 67 43
1000100 104 68 44
1000101 105 69 45
1000110 106 70 46
1000111 107 71 47
1001000 110 72 48
1001001 111 73 49
1001010 112 74 4A
1001011 113 75 4B
1001100 114 76 4C
1001101 115 77 4D
1001110 116 78 4E
1001111 117 79 4F
1010000 120 80 50
1010001 121 81 51
1010010 122 82 52
1010011 123 83 53
1010100 124 84 54
1010101 125 85 55
1010110 126 86 56
1010111 127 87 57
1011000 130 88 58
1011001 131 89 59
1011010 132 90 5A
1011011 133 91 5B
1011100 134 92 5C
1011101 135 93 5D
1011110 136 94 5E
1011111 137 95 5F
1100000 140 96 60
1100001 141 97 61
1100010 142 98 62
1100011 143 99 63
1100100 144 100 64

相關詞條

相關搜尋

熱門詞條

聯絡我們