1. 程式人生 > >計算機中數據的本質

計算機中數據的本質

-a 空字符 換行 cin 格式 同步 之前 物理 常用

聲明:我的文章完全是原創,轉載需要註明出處,並且本人享有該文章的所有知識產權。

經過上篇文章,我們了解了軟件和硬件,那麽今天我們來討論一下真實的計算機中是如何存儲數據的。

首先我們討論一下二進制,二進制說來很簡單,無非就是1和0。由於我們的計算機是電子產品,裏面有的只有電路結構,也就是我們所有的理論都需要建立在物理層面上,那麽我們1和0究竟是怎麽得到的呢?

在之前講過,燈泡的開關,我們可以用1代表開,用0帶表關。但是真實的情況是這樣的嗎?

其實在真正的應用中,我們主要使用的是兩類邏輯0和1的表示方式(TTL,RS-232)

TTL常用標準:

如果電源電壓為5V,那麽低於低於0.8V為0,3.6V(2.4V~5V)為1

如果電源電壓為3.3V,那麽低於0.8V為0,3.4V(2~2.4V)為1

RS-232常用標準:

+3V~+15V表示0,-3V~-15V表示1

這就是邏輯電路裏的1和0的表示方式。有了這個基礎,我們再來看一下在我們系統中是如何表示各種符號的。

由於我們一個電信號只能更精確的表示兩種狀態,因此,如果只使用1位二進制數來表示我們遇到的各種符號(文字,標點等)是不現實的,那麽計算機是怎麽表示這些信息的呢?

由於摩爾發明了電報,他們只需要27個符號就能表達出所有常用的字母數字和字符,因此一開始是使用了7個二進制位來表達字母和數字以及標點符號--ASCII

ASCII控制字符

二進制十進制十六進制縮寫可以顯示的表示法名稱/意義
0000 0000 0 00 NUL ? 空字符(Null)
0000 0001 1 01 SOH ? 標題開始
0000 0010 2 02 STX ? 本文開始
0000 0011 3 03 ETX ? 本文結束
0000 0100 4 04 EOT ? 傳輸結束
0000 0101 5 05 ENQ ? 請求
0000 0110 6 06 ACK ? 確認回應
0000 0111 7 07 BEL ? 響鈴
0000 1000 8 08 BS ? 退格
0000 1001 9 09 HT ? 水平定位符號
0000 1010 10 0A LF ? 換行鍵
0000 1011 11 0B VT ? 垂直定位符號
0000 1100 12 0C FF ? 換頁鍵
0000 1101 13 0D CR ? 歸位鍵
0000 1110 14 0E SO ? 取消變換(Shift out)
0000 1111 15 0F SI ? 啟用變換(Shift in)
0001 0000 16 10 DLE ? 跳出數據通訊
0001 0001 17 11 DC1 ? 設備控制一(XON 啟用軟件速度控制)
0001 0010 18 12 DC2 ? 設備控制二
0001 0011 19 13 DC3 ? 設備控制三(XOFF 停用軟件速度控制)
0001 0100 20 14 DC4 ? 設備控制四
0001 0101 21 15 NAK ? 確認失敗回應
0001 0110 22 16 SYN ? 同步用暫停
0001 0111 23 17 ETB ? 區塊傳輸結束
0001 1000 24 18 CAN ? 取消
0001 1001 25 19 EM ? 連接介質中斷
0001 1010 26 1A SUB ? 替換
0001 1011 27 1B ESC ? 跳出
0001 1100 28 1C FS ? 文件分割符
0001 1101 29 1D GS ? 組群分隔符
0001 1110 30 1E RS ? 記錄分隔符
0001 1111 31 1F US ? 單元分隔符
0111 1111 127 7F DEL ? 刪除

ASCII可顯示字符

二進制十進制十六進制圖形
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 ~

但是隨著人們對信息的積累,發現還另外需要一些符號來表達相關的信息,因此IBM建議使用8位來表示所有的字母、數字、標點符號--ASCII擴展碼。使用8位二進制來表示符號的方法一直延用至今。但是由於當時只是建議使用8位來表示信息,但是最後一位沒有確定對應的符號,所以各個廠商根據自己的情況,定義了不同的符號,因此就有了不同的規範,因此有可能同一個擴展的ASCII代表的符號不同。這個比較少用,所以這裏不再介紹。

前面花了很多時間在介紹ASCII,這是為何?因為我們現在的電子計算機,基本都遵守著這個約定來存取數據。用8個二進制位代表一個字符,IBM給這8個二進制位取了一個名字,叫做字節byte。同時一個二進制我們通常叫做位(bit)。

可能有朋友會想,在ASCII裏沒有中文啊,都是字母 數字 符號,那麽中文是怎麽存取的呢?

實際上我們的中文等象形文字都是使用兩個字節(2byte)的方式進行數據的存取。我們把以2個字節的方式進行數據存取的方式叫做UNICODE編碼。UNICODE編碼有很多實現方案,導致相同的二進制數在不同的編碼格式中代表了不同的含義,所以如果需要還原出原來的文字信息,就必須使用特定的編碼方式才行,這裏就像諜戰片中的破敵方電報內容一樣,好不容易截獲了敵人的電報信息,還得靠密碼本才能還原電報的內容。

常見的UNICODE編碼有:UTF8,GB2312,GBK,ISO8859-1;

了解這個知識很重要,在以後編程過程中,經常會遇到編碼問題導致屏幕顯示的數據亂碼。

當然,正如大家看到的那樣,用0和1表示ASCII碼的時候比較長,使用十進制顯示的時候換算的時候比較麻煩,所以我們通常使用十六進制對計算機中的二進制信息進行顯示。

二進制:由0~1組成,遇2進1.

十進制:由0~9組成,遇9進1

十六進制:由0~F組成,遇F進1(0~9,A~F)

由二進制轉十六進制的方法:

把8位數據拆分為4位一組:0011 0000

以8、4、2、1原則進行計算

8 4 2 1
x 0 0 1 1
---------
0+0+2+1 = 3

由於4位二進制最大只能表示15,所以,我們使用十六進制簡化8個二進制位的長度。因此0011 0000用十六進制表示為30,為了防止與十進制發生歧義,十六進制數通常在前面加上0x表示,因此最終結果為0x30。

作業:

1、如下ASCII表示的字母是什麽

0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x21

2、使用UTF8的編碼方式在存儲中取得的信息如下,請幫忙還原一下該數據的值

0x00 0x48 0x00 0x65 0x00 0x6c 0x00 0x6c 0x00 0x6f 0x00 0x20 0x00 0x57 0x00 0x6f 0x00 0x72 0x00 0x6c 0x00 0x64 0x00 0x21

3、總結一下題1和題2的特點,並將ASCII與UNICODE建立聯系

4、使用UTF8的編碼方式編碼“計算機軟硬結合”,並寫出來(通過查表的方式得到十六進制,再將十六進制轉換為二進制)。

對應的作業請參考“百度”,比如UTF8的編碼表

計算機中數據的本質