OCT(八進制)
最全ASCII碼對應表—與鍵盤按鍵對應值
(二進)Bin (十進)Dec (十六進)Hex 縮寫/字符 解釋
0000 0000 0 00 NUL (null) 空字符
0000 0001 1 01 SOH (start of handing) 標題開始
0000 0010 2 02 STX (start of text) 正文開始
0000 0011 3 03 ETX (end of text) 正文結束
0000 0100 4 04 EOT (end of transmission) 傳輸結束
0000 0101 5 05 ENQ (enquiry) 請求
0000 0110 6 06 ACK (acknowledge) 收到通知
0000 0111 7 07 BEL (bell) 響鈴
0000 1000 8 08 BS (backspace) 退格
0000 1001 9 09 HT (horizontal tab) 水平制表符
0000 1010 10 0A LF (NL line feed, new line) 換行鍵
0000 1011 11 0B VT (vertical tab) 垂直制表符
0000 1100 12 0C FF (NP form feed, new page) 換頁鍵
0000 1101 13 0D CR (carriage return) 回車鍵
0000 1110 14 0E SO (shift out) 不用切換
0000 1111 15 0F SI (shift in) 啟用切換
0001 0000 16 10 DLE (data link escape) 數據鏈路轉義
0001 0001 17 11 DC1 (device control 1) 設備控制1
0001 0010 18 12 DC2 (device control 2) 設備控制2
0001 0011 19 13 DC3 (device control 3) 設備控制3
0001 0100 20 14 DC4 (device control 4) 設備控制4
0001 0101 21 15 NAK (negative acknowledge) 拒絕接收
0001 0110 22 16 SYN (synchronous idle) 同步空閑
0001 0111 23 17 ETB (end of trans. block) 傳輸塊結束
0001 1000 24 18 CAN (cancel) 取消
0001 1001 25 19 EM (end of medium) 介質中斷
0001 1010 26 1A SUB (substitute) 替補
0001 1011 27 1B ESC (escape) 溢出
0001 1100 28 1C FS (file separator) 文件分割符
0001 1101 29 1D GS (group separator) 分組符
0001 1110 30 1E RS (record separator) 記錄分離符
0001 1111 31 1F US (unit separator) 單元分隔符
0010 0000 32 20 空格
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25 %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~
0111 1111 127 7F DEL (delete) 刪除
鍵盤常用ASCII碼(十進制表示值)
ESC鍵 VK_ESCAPE (27)
回車鍵: VK_RETURN (13)
TAB鍵: VK_TAB (9)
Caps Lock鍵: VK_CAPITAL (20)
Shift鍵: VK_SHIFT (16)
Ctrl鍵: VK_CONTROL (17)
Alt鍵: VK_MENU (18)
空格鍵: VK_SPACE (/32)
退格鍵: VK_BACK (8)
左徽標鍵: VK_LWIN (91)
右徽標鍵: VK_LWIN (92)
鼠標右鍵快捷鍵:VK_APPS (93)
Insert鍵: VK_INSERT (45)
Home鍵: VK_HOME (36)
Page Up: VK_PRIOR (33)
PageDown: VK_NEXT (34)
End鍵: VK_END (35)
Delete鍵: VK_DELETE (46)
方向鍵(←): VK_LEFT (37)
方向鍵(↑): VK_UP (38)
方向鍵(→): VK_RIGHT (39)
方向鍵(↓): VK_DOWN (40)
F1鍵: VK_F1 (112)
F2鍵: VK_F2 (113)
F3鍵: VK_F3 (114)
F4鍵: VK_F4 (115)
F5鍵: VK_F5 (116)
F6鍵: VK_F6 (117)
F7鍵: VK_F7 (118)
F8鍵: VK_F8 (119)
F9鍵: VK_F9 (120)
F10鍵: VK_F10 (121)
F11鍵: VK_F11 (122)
F12鍵: VK_F12 (123)
Num Lock鍵: VK_NUMLOCK (144)
小鍵盤0: VK_NUMPAD0 (96)
小鍵盤1: VK_NUMPAD0 (97)
小鍵盤2: VK_NUMPAD0 (98)
小鍵盤3: VK_NUMPAD0 (99)
小鍵盤4: VK_NUMPAD0 (100)
小鍵盤5: VK_NUMPAD0 (101)
小鍵盤6: VK_NUMPAD0 (102)
小鍵盤7: VK_NUMPAD0 (103)
小鍵盤8: VK_NUMPAD0 (104)
小鍵盤9: VK_NUMPAD0 (105)
小鍵盤.: VK_DECIMAL (110)
小鍵盤*: VK_MULTIPLY (106)
小鍵盤+: VK_MULTIPLY (107)
小鍵盤-: VK_SUBTRACT (109)
小鍵盤/: VK_DIVIDE (111)
Pause Break鍵: VK_PAUSE (19)
Scroll Lock鍵: VK_SCROLL (145)
Bin二進 |
Dec十進 |
Hex十六進 |
縮寫/字符 |
解釋 |
00000000 |
0 |
00 |
NUL(null) |
空字符 |
00000001 |
1 |
01 |
SOH(start of handling) |
標題開始 |
00000010 |
2 |
02 |
STX (start of text) |
正文開始 |
00000011 |
3 |
03 |
ETX (end of text) |
正文結束 |
00000100 |
4 |
04 |
EOT (end of transm-ission) |
傳輸結束 |
00000101 |
5 |
05 |
ENQ (enquiry) |
請求 |
00000110 |
6 |
06 |
ACK (acknow-ledge) |
收到通知 |
00000111 |
7 |
07 |
BEL (bell) |
響鈴 |
00001000 |
8 |
08 |
BS (backsp-ace) |
退格 |
00001001 |
9 |
09 |
HT (horizon-tal tab) |
水平制表符 |
00001010 |
10 |
0A |
LF (NL line feed, new line) |
換行鍵 |
00001011 |
11 |
0B |
VT (vertical tab) |
垂直制表符 |
00001100 |
12 |
0C |
FF (NP form feed, new page) |
換頁鍵 |
00001101 |
13 |
0D |
CR (carriage return) |
回車鍵 |
00001110 |
14 |
0E |
SO (shift out) |
不用切換 |
00001111 |
15 |
0F |
SI (shift in) |
啟用切換 |
00010000 |
16 |
10 |
DLE (data link escape) |
數據鏈路轉義 |
00010001 |
17 |
11 |
DC1 (device control 1) |
設備控制1 |
00010010 |
18 |
12 |
DC2 (device control 2) |
設備控制2 |
00010011 |
19 |
13 |
DC3 (device control 3) |
設備控制3 |
00010100 |
20 |
14 |
DC4 (device control 4) |
設備控制4 |
00010101 |
21 |
15 |
NAK (negati-ve acknowl-edge) |
拒絕接收 |
00010110 |
22 |
16 |
SYN (synchr-onous idle) |
同步空閑 |
00010111 |
23 |
17 |
ETB (end of trans. block) |
傳輸塊結束 |
00011000 |
24 |
18 |
CAN (cancel) |
取消 |
00011001 |
25 |
19 |
EM (end of medium) |
介質中斷 |
00011010 |
26 |
1A |
SUB (substit-ute) |
替補 |
00011011 |
27 |
1B |
ESC (escape) |
溢出 |
00011100 |
28 |
1C |
FS (file separat-or) |
文件分割符 |
00011101 |
29 |
1D |
GS (group separat-or) |
分組符 |
00011110 |
30 |
1E |
RS (record separat-or) |
記錄分離符 |
00011111 |
31 |
1F |
US (unit separat-or) |
單元分隔符 |
00100000 |
32 |
20 |
|
空格 |
00100001 |
33 |
21 |
! |
|
00100010 |
34 |
22 |
" |
|
00100011 |
35 |
23 |
# |
|
00100100 |
36 |
24 |
$ |
|
00100101 |
37 |
25 |
% |
|
00100110 |
38 |
26 |
& |
|
00100111 |
39 |
27 |
' |
|
00101000 |
40 |
28 |
( |
|
00101001 |
41 |
29 |
) |
|
00101010 |
42 |
2A |
* |
|
00101011 |
43 |
2B |
+ |
|
00101100 |
44 |
2C |
, |
|
00101101 |
45 |
2D |
- |
|
00101110 |
46 |
2E |
. |
|
00101111 |
47 |
2F |
/ |
|
00110000 |
48 |
30 |
0 |
|
00110001 |
49 |
31 |
1 |
|
00110010 |
50 |
32 |
2 |
|
00110011 |
51 |
33 |
3 |
|
00110100 |
52 |
34 |
4 |
|
00110101 |
53 |
35 |
5 |
|
00110110 |
54 |
36 |
6 |
|
00110111 |
55 |
37 |
7 |
|
00111000 |
56 |
38 |
8 |
|
00111001 |
57 |
39 |
9 |
|
00111010 |
58 |
3A |
: |
|
00111011 |
59 |
3B |
; |
|
00111100 |
60 |
3C |
< |
|
00111101 |
61 |
3D |
= |
|
00111110 |
62 |
3E |
> |
|
00111111 |
63 |
3F |
? |
|
01000000 |
64 |
40 |
@ |
|
01000001 |
65 |
41 |
A |
|
01000010 |
66 |
42 |
B |
|
01000011 |
67 |
43 |
C |
|
01000100 |
68 |
44 |
D |
|
01000101 |
69 |
45 |
E |
|
01000110 |
70 |
46 |
F |
|
01000111 |
71 |
47 |
G |
|
01001000 |
72 |
48 |
H |
|
01001001 |
73 |
49 |
I |
|
01001010 |
74 |
4A |
J |
|
01001011 |
75 |
4B |
K |
|
01001100 |
76 |
4C |
L |
|
01001101 |
77 |
4D |
M |
|
01001110 |
78 |
4E |
N |
|
01001111 |
79 |
4F |
O |
|
01010000 |
80 |
50 |
P |
|
01010001 |
81 |
51 |
Q |
|
01010010 |
82 |
52 |
R |
|
01010011 |
83 |
53 |
S |
|
01010100 |
84 |
54 |
T |
|
01010101 |
85 |
55 |
U |
|
01010110 |
86 |
56 |
V |
|
01010111 |
87 |
57 |
W |
|
01011000 |
88 |
58 |
X |
|
01011001 |
89 |
59 |
Y |
|
01011010 |
90 |
5A |
Z |
|
01011011 |
91 |
5B |
[ |
|
01011100 |
92 |
5C |
\ |
|
01011101 |
93 |
5D |
] |
|
01011110 |
94 |
5E |
^ |
|
01011111 |
95 |
5F |
_ |
|
01100000 |
96 |
60 |
` |
|
01100001 |
97 |
61 |
a |
|
01100010 |
98 |
62 |
b |
|
01100011 |
99 |
63 |
c |
|
01100100 |
100 |
64 |
d |
|
01100101 |
101 |
65 |
e |
|
01100110 |
102 |
66 |
f |
|
01100111 |
103 |
67 |
g |
|
01101000 |
104 |
68 |
h |
|
01101001 |
105 |
69 |
i |
|
01101010 |
106 |
6A |
j |
|
01101011 |
107 |
6B |
k |
|
01101100 |
108 |
6C |
l |
|
01101101 |
109 |
6D |
m |
|
01101110 |
110 |
6E |
n |
|
01101111 |
111 |
6F |
o |
|
01110000 |
112 |
70 |
p |
|
01110001 |
113 |
71 |
q |
|
01110010 |
114 |
72 |
r |
|
01110011 |
115 |
73 |
s |
|
01110100 |
116 |
74 |
t |
|
01110101 |
117 |
75 |
u |
|
01110110 |
118 |
76 |
v |
|
01110111 |
119 |
77 |
w |
|
01111000 |
120 |
78 |
x |
|
01111001 |
121 |
79 |
y |
|
01111010 |
122 |
7A |
z |
|
01111011 |
123 |
7B |
{ |
|
01111100 |
124 |
7C |
| |
|
01111101 |
125 |
7D |
} |
|
01111110 |
126 |
7E |
~ |
|
01111111 |
127 |
7F |
DEL (delete) |
刪除 |
常見ASCII碼的大小規則:0~9<A~Z<a~z
1)數字比字母要小。如 “7”<“F”;
2)數字0比數字9要小,並按0到9順序遞增。如 “3”<“8” ;
3)字母A比字母Z要小,並按A到Z順序遞增。如“A”<“Z” ;
4)同個字母的大寫字母比小寫字母要小32。如“A”<“a” 。
記住幾個常見字母的ASCII碼大小: “A”為65;“a”為97;“0”為 48。
另外還有128-255的ASCII字符
字符集簡史
6000年前 象形文字
3000年前 字母表
1838年到1854年 Samuel F. B. Morse發明了電報,字母表中的每個字符對應於一系列短的和長的脈沖
1821年到1824年 Louis Braille發明盲文,6位代碼,它把字符、常用字母組合、常用單字和標點進行編碼。
一個特殊的escape代碼表示后續的字符代碼應解釋為大寫。一個特殊的shift代碼允許后續代碼被解釋為數字。
1931年 CCITT標准化Telex代碼,包括Baudot #2的代碼,都是包括字符和數字的5位代碼。
1890年 早期計算機的字符碼是從Hollerith卡片,6位字符碼系統BCDIC(Binary-Coded Decimal Interchange Code:二進制編碼十進制交換編碼)
60年代 擴展為8位EBCDIC,IBM大型主機的標准
1967年 美國信息交換標准碼(ASCII:American Standard Code for Information Interchange)
在字符長度是6位、7位還是8位的問題上產生了很大的爭議。從可靠性的觀點來看不應使用替換字符,
因此ASCII不能是6位編碼,但由於費用的原因也排除了8位版本的方案(當時每位的儲存空間成本仍很昂貴)。
這樣,最終的字符碼就有26個小寫字母、26個大寫字母、10個數字、32個符號、33個句柄和一個空格,總共128個字符碼。
ASCII現在記錄在ANSI X3.4-1986字符集-用於信息交換的7位美國國家標准碼(7-Bit ASCII:7-Bit American National
Standard Code for Information Interchange),由美國國家標准協會(American National Standards Institute)發布。
圖2-1中所示的ASCII字符碼與ANSI文件中的格式相似。
ASCII國際問題
ASCII是美國標准,所以它不能良好滿足其它講英語國家的需要。例如英國的英鎊符號(£)在哪里?
拉丁語字母表重音符號
使用斯拉夫字母表的希臘語、希伯來語、阿拉伯語和俄語。
漢字系統的中國象形漢字,日本和朝鮮。
1967年,國際標准化組織(ISO:International Standards Organization)推薦一個ASCII的變種,
代碼0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“為國家使用保留”,而代碼0x5E、0x60和0x7E標為
“當國內要求的特殊字符需要8、9或10個空間位置時,可用於其它圖形符號”。這顯然不是一個最佳的國際解決方案,
因為這並不能保證一致性。但這卻顯示了人們如何想盡辦法為不同的語言來編碼的。
擴展ASCII
1981年 IBM PC ROM256個字符的字符集,即IBM擴展字符集
1985年11 Windows字符集被稱作“ANSI字符集”,遵循了ANSI草案和ISO標准(ANSI/ISO 8859-1-1987,簡“Latin 1”。
ANSI字符集的最初版本:
1987年4月代碼頁437,字符的映像代碼,出現在MS-DOS 3.3
雙字節字符集
雙字節字符集(DBCS:double-byte character set),解決中國、日本和韓國的象形文字符和ASCII的某種兼容性。
DBCS從256代碼開始,就像ASCII一樣。與任何行為良好的代碼頁一樣,最初的128個代碼是ASCII。
然而,較高的128個代碼中的某些總是跟隨着第二個字節。
這兩個字節一起(稱作首字節和跟隨字節)定義一個字符,通常是一個復雜的象形文字。
鍵盤常用ASCII碼
ESC鍵 VK_ESCAPE (27)
回車鍵: VK_RETURN (13)
TAB鍵: VK_TAB (9)
Caps Lock鍵: VK_CAPITAL (20)
Shift鍵: VK_SHIFT (16)
Ctrl鍵: VK_CONTROL (17)
Alt鍵: VK_MENU (18)
空格鍵: VK_SPACE (32)
退格鍵: VK_BACK (8)
左徽標鍵: VK_LWIN (91)
右徽標鍵: VK_LWIN (92)
鼠標右鍵快捷鍵:VK_APPS (93)
Insert鍵: VK_INSERT (45)
Home鍵: VK_HOME (36)
Page Up: VK_PRIOR (33)
PageDown: VK_NEXT (34)
End鍵: VK_END (35)
Delete鍵: VK_DELETE (46)
方向鍵(←): VK_LEFT (37)
方向鍵(↑): VK_UP (38)
方向鍵(→): VK_RIGHT (39)
方向鍵(↓): VK_DOWN (40)
F1鍵: VK_F1 (112)
F2鍵: VK_F2 (113)
F3鍵: VK_F3 (114)
F4鍵: VK_F4 (115)
F5鍵: VK_F5 (116)
F6鍵: VK_F6 (117)
F7鍵: VK_F7 (118)
F8鍵: VK_F8 (119)
F9鍵: VK_F9 (120)
F10鍵: VK_F10 (121)
F11鍵: VK_F11 (122)
F12鍵: VK_F12 (123)
Num Lock鍵: VK_NUMLOCK (144)
小鍵盤0: VK_NUMPAD0 (48)
小鍵盤1: VK_NUMPAD0 (49)
小鍵盤2: VK_NUMPAD0 (50)
小鍵盤3: VK_NUMPAD0 (51)
小鍵盤4: VK_NUMPAD0 (52)
小鍵盤5: VK_NUMPAD0 (53)
小鍵盤6: VK_NUMPAD0 (54)
小鍵盤7: VK_NUMPAD0 (55)
小鍵盤8: VK_NUMPAD0 (56)
小鍵盤9: VK_NUMPAD0 (57)
小鍵盤.: VK_DECIMAL (46)
小鍵盤*: VK_MULTIPLY (42)
小鍵盤+: VK_ADD (43)
小鍵盤-: VK_SUBTRACT (45)
小鍵盤/: VK_DIVIDE (47)
Pause Break鍵: VK_PAUSE (19)
Scroll Lock鍵: VK_SCROLL (145)
ASCII碼的算法:
A在ascii中定義為01000001,也就是十進制65,有了這個標准后,當我們輸入A時,計算機就可以通過ascii碼知道輸入的字符的二進制編碼是01000001。而沒有這樣的標准,我們就必須自己想辦法告訴計算機我們輸入了一個A;沒有這樣的標准,我們在別的機器上就需要重新編碼以告訴計算機我們要輸入A。ascii碼指的不是十進制,是二進制。只是用十進制表示習慣一點罷了,比如在ascii碼中,A的二進制編碼為01000001,如果用十進制表示是65,用十六進制表示就是41H。
在ascii碼表中,只包括了一些字符、數字、標點符號的信息表示,這主要是因為計算機是美國發明的,在英文下面,我們使用ascii表示就足夠了!但是在漢字輸入下面,用ascii碼就不能表示了,而漢字只是中國的通用表示,所以如果我們要在計算機中輸入漢字,就必須有一個像ascii碼的標准來表示每一個漢字,這就是中國的漢字國標碼,它定義了漢字在計算機中的一個表示標准。通過這個標准,但我們輸入漢字的時候,我們的輸入碼就轉換為區位碼,通過唯一的區位碼得到這個漢字的字形碼並顯示出來。當然漢字的區位碼在計算機中也是用二進制表示的!
二進制數轉換為十進制數
二進制數第0位的權值是2的0次方,第1位的權值是2的1次方……
所以,設有一個二進制數:0110 0100,轉換為10進制為:
下面是豎式:
0110 0100 換算成 十進制
第0位 0 * 2^0 = 0
第1位 0 * 2^1 = 0
第2位 1 * 2^2 = 4
第3位 0 * 2^3 = 0
第4位 0 * 2^4 = 0
第5位 1 * 2^5 = 32
第6位 1 * 2^6 = 64
第7位 0 * 2^7 = 0
---------------------------
100
用橫式計算為:
0 * 2^0 + 0 * 2^1 + 1 * 2^2 +0*2^3+ 0 * 2^4 + 1 * 2^5 + 1 * 2^6 + 0 * 2^7 = 100
0乘以多少都是0,所以我們也可以直接跳過值為0的位:
1 * 2^2 + 1 * 2^5 + 1 * 2^6 = 100
6.2.2 八進制數轉換為十進制數
八進制就是逢8進1。
八進制數采用 0~7這八數來表達一個數。
八進制數第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……
所以,設有一個八進制數:1507,轉換為十進制為:
用豎式表示:
1507換算成十進制。
第0位 7 * 8^0 = 7
第1位 0 * 8^1 = 0
第2位 5 * 8^2 = 320
第3位 1 * 8^3 = 512
--------------------------
839
同樣,我們也可以用橫式直接計算:
7 * 8^0 + 0 * 8^1 + 5 * 8^2 + 1 * 8^3 = 839
結果是,八進制數 1507 轉換成十進制數為 839
6.2.3 八進制數的表達方法
C,C++語言中,如何表達一個八進制數呢?如果這個數是 876,我們可以斷定它不是八進制數,因為八進制數中不可能出7以上的阿拉伯數字。但如果這個數是123、是567,或12345670,那么它是八進制數還是10進制數,都有可能。
所以,C,C++規定,一個數如果要指明它采用八進制,必須在它前面加上一個0,如:123是十進制,但0123則表示采用八進制。這就是八進制數在C、C++中的表達方法。
由於C和C++都沒有提供二進制數的表達方法,所以,這里所學的八進制是我們學習的,CtC++語言的數值表達的第二種進制法。
現在,對於同樣一個數,比如是100,我們在代碼中可以用平常的10進制表達,例如在變量初始化時:
int a = 100;
我們也可以這樣寫:
int a = 0144; //0144是八進制的100;一個10進制數如何轉成8進制,我們后面會學到。
千萬記住,用八進制表達時,你不能少了最前的那個0。否則計算機會通通當成10進制。不過,有一個地方使用八進制數時,卻不能使用加0,那就是我們前面學的用於表達字符的“轉義符”表達法。
6.2.4 八進制數在轉義符中的使用
我們學過用一個轉義符'\'加上一個特殊字母來表示某個字符的方法,如:'\n'表示換行(line),而'\t'表示Tab字符,'\''則表示單引號。今天我們又學習了一種使用轉義符的方法:轉義符'\'后面接一個八進制數,用於表示ASCII碼等於該值的字符。
比如,查一下第5章中的ASCII碼表,我們找到問號字符(?)的ASCII值是63,那么我們可以把它轉換為八進值:77,然后用 '\77'來表示'?'。由於是八進制,所以本應寫成 '\077',但因為C,C++規定不允許使用斜杠加10進制數來表示字符,所以這里的0可以不寫。
事實上我們很少在實際編程中非要用轉義符加八進制數來表示一個字符,所以,6.2.4小節的內容,大家僅僅了解就行。
6.2.5 十六進制數轉換成十進制數
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次方。
假設有一個十六進數 2AF5, 那么如何換算成10進制呢?
用豎式計算:
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
6.2.6 十六進制數的表達方法
如果不使用特殊的書寫形式,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' 表示以外,我們很少用后兩種方法表示一個字符。
6.3 十進制數轉換到二、八、十六進制數
6.3.1 10進制數轉換為2進制數
給你一個十進制,比如:6,如果將它轉換成二進制數呢?
10進制數轉換成二進制數,這是一個連續除2的過程:
把要轉換的數,除以2,得到商和余數,
將商繼續除以2,直到商為0。最后將所有余數倒序排列,得到數就是轉換結果。
聽起來有些糊塗?我們結合例子來說明。比如要轉換6為二進制數。
“把要轉換的數,除以2,得到商和余數”。
那么:
要轉換的數是6, 6 ÷ 2,得到商是3,余數是0。 (不要告訴我你不會計算6÷3!)
“將商繼續除以2,直到商為0……”
現在商是3,還不是0,所以繼續除以2。
那就: 3 ÷ 2, 得到商是1,余數是1。
“將商繼續除以2,直到商為0……”
現在商是1,還不是0,所以繼續除以2。
那就: 1 ÷ 2, 得到商是0,余數是1 (拿筆紙算一下,1÷2是不是商0余1!)
“將商繼續除以2,直到商為0……最后將所有余數倒序排列”
好極!現在商已經是0。
我們三次計算依次得到余數分別是:0、1、1,將所有余數倒序排列,那就是:110了!
6轉換成二進制,結果是110。
把上面的一段改成用表格來表示,則為:
被除數 計算過程 商 余數
6 6/2 3 0
3 3/2 1 1
1 1/2 0 1
(在計算機中,÷用 / 來表示)
如果是在考試時,我們要畫這樣表還是有點費時間,所更常見的換算過程是使用下圖的連除:
(圖:1)
請大家對照圖,表,及文字說明,並且自已拿筆計算一遍如何將6轉換為二進制數。
說了半天,我們的轉換結果對嗎?二進制數110是6嗎?你已經學會如何將二進制數轉換成10進制數了,所以請現在就計算一下110換成10進制是否就是6。
6.3.2 10進制數轉換為8、16進制數
非常開心,10進制數轉換成8進制的方法,和轉換為2進制的方法類似,惟一變化:除數由2變成8。
來看一個例子,如何將十進制數120轉換成八進制數。
用表格表示:
被除數 計算過程 商 余數
120 120/8 15 0
15 15/8 1 7
1 1/8 0 1
120轉換為8進制,結果為:170。
非常非常開心,10進制數轉換成16進制的方法,和轉換為2進制的方法類似,惟一變化:除數由2變成16。
同樣是120,轉換成16進制則為:
被除數 計算過程 商 余數
120 120/16 7 8
7 7/16 0 7
120轉換為16進制,結果為:78。
請拿筆紙,采用(圖:1)的形式,演算上面兩個表的過程。
6.4 二、十六進制數互相轉換
二進制和十六進制的互相轉換比較重要。不過這二者的轉換卻不用計算,每個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 + 4 + 0 + 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 10 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
同樣,如果一個二進制數很長,我們需要將它轉換成10進制數時,除了前面學過的方法是,我們還可以先將這個二進制轉換成16進制,然后再轉換為10進制。
下面舉例一個int類型的二進制數:
01101101 11100101 10101111 00011011
我們按四位一組轉換為16進制: 6D E5 AF 1B