電腦數據的表示 1. 數值數據的表示 1.1 各種進位數的表示 二進位 (Binary) :以 0b 或 0B 開頭,字元僅含0和1. 用下標2或者數字後面加B表示。如 $(1011)_2$ 或 $1011B$ 八進位 (Octal) :以 0o 或 0O 開頭,字元含0-7. 用下標8或者數字後 ...
電腦數據的表示
1. 數值數據的表示
1.1 各種進位數的表示
-
二進位 (Binary) :以
0b
或0B
開頭,字元僅含0和1.- 用下標2或者數字後面加
B
表示。如 $(1011)_2$ 或 $1011B$
- 用下標2或者數字後面加
-
八進位 (Octal) :以
0o
或0O
開頭,字元含0-7.- 用下標8或者數字後面加
O
表示。如 $(17)_8$ 或 $17O$
- 用下標8或者數字後面加
-
十六進位 (Hexadecimal) :以
0x
或0X
開頭,字元含0-9、a-f(代表10-15).- 用下標16或者數字後面加
H
表示。如 $(a1b1)_{16}$ 或 $a1b1H$
- 用下標16或者數字後面加
1.2 進位轉換
R進位與十進位的轉換
- R進位轉十進位:按位權展開。計算每位數字與該位位權乘積的代數和然後相加。
- 十進位轉R進位:除以 R 逆序取餘。
二、八、十六進位互轉
-
二轉八進位:從右往左每三位轉一位八進位,最左邊不足三位添0補齊。反之八進位每一位轉三位二進位。
-
二轉十六進位:從右往左每四位轉一位十六進位,最左邊不足四位添0補齊。反之十六進位每一位轉四位二進位。
python中的相關函數:
-
int(*x*,base=10)
這個函數按照base進位對數x進行解釋,返回一個使用數字或字元串生成的整數int對象,無實參返回0。
其中x為數字或字元串,base為進位,取值範圍為[2,36]和0。
一個進位為n的整數包含0到n-1的整數,其中a-z(A-Z)表示10到35。
進位為0將會按照x字面的首碼進行解釋,結果是2、8、10、16中的一個。
要清楚的一點是,在python中帶有首碼的數字,例如0xa
,0o12
,0b1010
它們的類型(type)都是 int
整數類型。
如果想知道它們十進位數值,可以直接print
,或 print(int(x))
,也可以 int(str(x),base=0)
(?).
對這個函數的使用,主要分為三種情況:
- x為
int
類型:無論帶不帶首碼,這個數的進位已經清楚,它表示一個確定大小的數字。該函數無法對一個進位清楚的非字元串類型進行轉換(啟用base關鍵字)。 - x為
str
字元串類型:- 帶首碼:表明這個數的進位已經清楚,base只能等於其首碼或0。
- 不帶首碼:根據用法自由發揮。註意沒有首碼且令base=0的話應註意x其形式。比如int("010",base=0)是非法的。因為解釋器認為x是十進位數,但x形式是錯誤的。
- x為byte類型:暫時空缺。
x=int(156,base=2) #報錯
x=int(0x156,base=0) #報錯
x1="0101" #字元串
y1=int(x1,base=2) # 結果為整數5
y2=int(x1,base=8) # 結果為整數65
y3=int(x1,base=16) # 結果為整數257
y4=int(x1,base=35) # 結果為整數1226
x2="0xa5f1"
y5=int(x,base=16) # 結果為整數42481
y6=int(x,base=0) # 結果為整數42481
hex(x)
將整數轉換為以0x為首碼的十六進位字元串。
bin(x)
將整數轉換為以0b為首碼的二進位字元串。
oct(x)
將整數轉換為以0o為首碼的八進位字元串。
1.3 機器碼的表示
電腦中數的主要類型
- 整數(定點數)
- 無符號整數
- 8位($0~2^{8}-1$)
- 16位($0~2^{16}-1$)
- 32位($0~2^{32}-1$)
- 有符號整數
- 8位($-27~2-1$)
- 16位($-2{15}~2-1$) 16位整數
- 32位($-2{31}~2-1$) 短整數
- 64位($-2{63}~2-1$) 長整數
- 無符號整數
- 浮點數
- 32位(單精度浮點數)
- 64位(雙精度浮點數)
- 128位(擴充精度浮點數)
真值、字長、機器數
-
機器數:0或1 + 二進位絕對值
- 電腦不認識除了0和1之外的任何符號,因此要專門留出一位用來表示正負號。
- 將符號數字化的數,是數字在電腦中的二進位表示形式。
-
真值:正負號 + 二進位絕對值
- 電腦中的二進位機器數分為“
有符號數
”和“無符號數
”兩種。 - “無符號數”就是二進位數的每一位都代表對應位的數值;而在“有符號數”中規定最高位用來表示數據符號,其中1代表負,0代表正,這樣一來機器數本身就不等於真正的數值了。例如有符號數10000101,其最高位1代表負,所以餘下的“0000101”才是數值本身,所以其真正數值是-5,而如果是無符號數,則10000101所代表的是133。為區別起見,把帶符號位的機器數所對應的真正數值稱為機器數的“真值”。例:00100001的真值=0 0100001=+33(正號可以不寫,可以直接寫成33),10100011的真值=1 0100011=-35。
- 電腦中的二進位機器數分為“
-
字長
-
字:指電腦進行數據處理時,一次存取加工和傳送的數據長度(字長度)。一個字通常是位元組的整數倍。
-
字長 是指電腦一次可處理的二進位數的碼位長度,是電腦進行數據存儲和數據處理的運算單位。如我們通常所指的32位處理器,就是指該處理器的字長為32位,也就是一次能處理32位二進位數。通常稱16位是一個字,32位是一個雙字,64位是兩個雙字。
-
數值的轉換結果是與字長有關的。如果電腦字長為8位,十進位中的數+5轉換成二進位就是
00000101
,-5轉換成二進位就是10000101
;但如果字長是16位,+5轉換的結果就是00000000 00000101
,而-5轉換成二進位就是10000000 00000101
了。也就是對應的機器數要轉換為字長所代表的位數。 -
字長越長代表電腦的處理能力越強,可以處理的數越大。
-
在8位字長中,除去符號位,實際可以處理的數值大小範圍為[-127,-0]~[+0,127](即$2^7 -1$),共256個數。
-
16位字長可以處理的數值大小是[-32677,-0]~[0,32767]($2^{15} -1$)。
-
64位字長電腦可以處理的二進位數位位長度最大為64位,去掉符號位,則表示電腦可以處理的最大二進位數為 $2^{63}-1$,最小二進位數就是 $-2^{63}$。
-
-
註意 以上的“-0”與“0”的機器數是不一樣的,在8位字長中,-0為1 0000000,而+0為0 0000000;在16位字長中,-0為1 0000000 00000000,而+0為0 0000000 00000000。所以在二進位的機器數中,0也有兩個(-0和0),且表示形式並不一樣。
-
設機器字為8b字長,數N1的真值為 +1001110,數N2的真值為 -1001110,則N1、N2對應的機器數為:
01001110
11001110
原碼表示法
符號位加數值的二進位。
有正零和負零之分。
反碼表示法
-
正數的補碼、反碼和原碼都相同
-
負數的符號位與原碼、補碼相同,數值將原碼的數值位按位取反。
補碼表示法
原碼的計算不方便,因此引入補碼的概念
-
正數的補碼、反碼和原碼都相同
-
負數的的補碼是先把除符號位外其他各位取反,再在末位加1。
TH | 定點整數 | 定點小數 |
---|---|---|
原碼 | $-(2{n-1}-1),2-1$ | $(-1,1)$ |
反碼 | $-(2{n-1}-1),2-1$ | $(-1,1)$ |
補碼 | $-2{n-1},2-1$ | $[-1,1)$ |
- 運算前將所有參與運算的數據轉換為補碼
- 將轉換後的數值進行運算
- 運算結果再次求補碼,得到最後的結果
移碼表示法
1.4 二進位邏輯運算
-
與運算 AND
- 又稱邏輯乘。用符號$\land$ 或
·
表示
對應位均為1結果才為1.
- 又稱邏輯乘。用符號$\land$ 或
-
或運算 OR
- 又稱邏輯加。用符號 $\lor$ 或
+
表示
對應位有一個為1結果就為1.
- 又稱邏輯加。用符號 $\lor$ 或
-
非運算 NOT
- 按位取反
-
異或運算 XOR
- 用符號$\bigoplus$ 表示
對應位相同結果為0 ,不同結果為1。
- 用符號$\bigoplus$ 表示
2. 非數值數據的表示
- 非數值數據:文字和符號(字元)、圖像、聲音等
- 非數值數據的表示:對其進行二進位編碼。任何數據存儲到電腦中都是二進位數。
字元編碼
- 編碼:編碼是將源對象內容按照某種標準轉換為另一種格式內容。解碼是和編碼對應的,它使用和編碼相同的標准將編碼內容還原為最初的對象內容。
- 碼點:一個編碼表中的某個字元對應的代碼值。比如ASCII中字元
A
的碼點是65 - 字元集:某種編碼標準所支持的所有字元及其對應碼點的集合。(書寫系統字母與符號的集合)
- 字元編碼:字元到存儲在電腦上的內容(特定的位元組或位元組序列)之間的映射,是一種規則。通常特定的字元集採用特點的編碼方式。一種字元集可能有多種編碼方案,比如
utf-8
、utf-16
等
- 字元編碼:字元到存儲在電腦上的內容(特定的位元組或位元組序列)之間的映射,是一種規則。通常特定的字元集採用特點的編碼方式。一種字元集可能有多種編碼方案,比如
ASCII碼
常用的7位 $ASCII$ 碼(American Standard Code for Information Interchange碼,即美國信息交換標準代碼)的每個字元都由7個二進位位b6~b0 表示,有128個編碼,最多可表示128種字元。其中包括:
- 10個數字
0
~9
:30H~39H,48~57(十進位); - 26個小寫字母
a
~z
:61H~7AH ,97~122; - 26個大寫字母
A
~Z
:41H~5AH ,65~90; - 各種運算符號和標點符號等。
在電腦中,用1B(一個位元組)表示一個ASCII碼,其最高一位(b7位)填0,餘下的7b可以給出128個編碼,表示128個不同的字元和控制碼。
其中95個編碼,對應著電腦終端能敲入並且可以顯示的95個字元,印表機設備也能列印這95個字元,如大小寫各26個英文字母,0—9這10個數字元,通用的運算符和標點符號+,-,*,/,>,=,< 等等。
UTF-8編碼
- Unicode字元集
- 在Unicode中,每個字元占據一個碼位/Unicode 編號(用4位十六進位數表示,Code point:U+ FFFF),字元集中的字元與Unicode 編號一一映射。如
U+ 0000
為“Null
”,U+ 597D
="好
"。Unicode字元集共定義了1 114 112
個這樣的位,使用從0到10FFFF的十六進位數唯一地表示世界上幾乎所有字元。NCR(Numeric Character Reference),以「&#」
開頭的後接十進位數字,以「&#x」
開頭的後接十六進位數字。
- 在Unicode中,每個字元占據一個碼位/Unicode 編號(用4位十六進位數表示,Code point:U+ FFFF),字元集中的字元與Unicode 編號一一映射。如
由於電腦存儲數據通常是以位元組為單位的,而且出於相容之前的ASCII(0x00-0x7F)、節省存儲空間等諸多原因,需要一種具體的編碼方式來對字元碼位進行標識。規定每個字元的Unicode編號如何存儲(用一個位元組還是多個位元組存儲,用哪些位元組來存儲),常見的基於Unicode字元集的編碼方式有UTF-8
、UTF-16
及UTF-32
。
同一段二進位,每一個位元組一個編號還是每兩個位元組一個編號,解碼方式不一樣,得到的編號不一樣,對應的映射字元也不同,這就是亂碼的原因。“錕斤拷”、“燙”就是這樣來的。
漢字編碼
對於漢字,電腦的處理技術必須解決三個問題:
- 漢字輸入
- 漢字儲存與交換
- 漢字輸出
它們分別對應著漢字輸入碼、內碼、字模碼的概念。
因此,漢字編碼系統存在以下三種編碼:
- 漢字輸入碼
- 漢字內碼
- 漢字字模碼
漢字輸入碼
漢字輸入碼也稱 外碼 ,是為了將漢字輸入電腦而編製的代碼,是代表某一漢字的一串鍵盤符號。
漢字輸入碼種類:
- 數字編碼:如區位碼、國標碼、電報碼等。
- 拼音編碼:如全拼碼、雙拼碼、簡拼碼等。
- 字形編碼:如王碼五筆、鄭碼、大眾碼等。
- 音形編碼:如表形碼、智能ABC等。
兩種典型的數字編碼:
- 區位碼:是將國家標準局公佈的6763個兩級漢字分為94個區,每個區分94位,實際上把漢字表示成二維數組,每個漢字在數組中的下標就是區位碼。
- 例如“中”字位於54區48位,“中”字的區位碼即為“5448”。
- 國標碼:將區位碼加2020H,占用兩個位元組。
- 例如“中”字的國標碼為區位碼5448的區碼和位碼轉化為16進位,為3630H,再加2020H得國標碼5650H。
- 漢字字元集與編碼
- 1981年,GB2312-80國家標準,其字元及編碼稱為國標碼又叫國際交換碼。
- GB2312字元集的構成:
一級常用漢字3755個,按漢語拼音排列
二級常用漢字3008個,按偏旁部首排列
非漢字字元682個
一般用2個位元組來存放漢字;
漢字分區,每個區94個漢字;
漢字內碼
漢字內碼是用於漢字信息的存儲、交換、檢索等操作的機內代碼,一般採用兩個位元組表示。
-
漢字可以通過不同的輸入法輸入,但其內碼在電腦中是唯一的。
-
英文字元的機內代碼是7位的ASCII碼,當用一個位元組表示時,最高位為“0”。為了與英文字元能相互區別,漢字機內代碼中兩個位元組的最高位均規定為“1”。
-
機內碼等於漢字國標碼加上8080H。
- 例如“中”字的機內碼為5650H+8080H=D6D0H。
漢字字模碼
漢字字模碼又稱漢字字形碼,它是將漢字字形經過點陣數字化後形成的一串二進位數,用於漢字的顯示和列印。
-
根據漢字輸出的要求不同,點陣有以下幾種:
- 簡易型漢字:16×16, 32位元組/漢字
- 普通型漢字:24×24, 72位元組/漢字
- 提高型漢字:32×32,128位元組/漢字。
-
漢字字型檔:將所有漢字的字模點陣代碼按內碼順序集中起來,構成了漢字型檔。
-
漢字字形點陣中每個點的信息用一位二進位碼來表示,“1”表示對應位置處是黑點,“0”表示對應位置處是空白。
例如16×16點陣,每個漢字就要占32個位元組