數值編碼
編碼是用文字、符號或者數碼來表示某種信息的過程。對數值來說,主要有兩種編碼方式:定點格式和浮點格式。(現實中真實的數值被稱為真值。)
定點整數
小數點固定在數的最低位之后(最右側),稱其為定點整數。如果在最高位(最左側)就是定點小數。
定點整數不考慮正負,只表示0和正整數的話,就是無符號整數。
N位二進制共有\(2^N\)個編碼,表達真值:0 ~ \(2^N - 1\) 。
如16位和32位二進制所能表示的無符號整數范圍是:0 ~ \(2^{16} - 1\)和0 ~ \(2^{32} - 1\)
通常機器數的最高位(最左側)稱為符號位,用0表示正數、1表示負數,這就是有符號整數。
原碼、反碼、補碼
計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同 。
原碼:是一種計算機對數字的二進制定點表示方法。原碼不能直接參與運算,會出錯。
反碼:正數的反碼和原碼相同,負數的反碼是對正數逐位取反,符號位保持為1(負數)。
補碼:正整數的補碼是其二進制表示,與原碼相同。負數的補碼是將除符號位外所有位取反加1.
在原碼中計算出錯,是因為數學問題。
例如:在數學上1 + (-1) = 0,將其換算成二進制原碼的表現形式如下:
00000001+10000001=10000010 轉換10進制為-2,所以錯誤。
所以,在計算機系統中,數值一律用補碼來表示和存儲。因為補碼可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。
在補碼中,負數補碼是將對應正數補碼取反(即將0變為1,1變為0)再加1形成。
例如:正整數105,用8位補碼表示:
\([105]_{補碼}\) = 01101001B
負整數-105,用8位補碼表示:
\([-105]_{補碼}\) = \([01101001B]_{取反}\) + 1 = 10010110B + 1 = 10010111B
所以,補碼就是用來解決負數在計算機中的表示問題。
最后總結如下:
對於正數來說:補碼 = 原碼 = 反碼
對於負數來說:補碼 = 原碼的反碼 + 1
字符的編碼
在計算機中,字符需要用若干位二進制碼的組合表示,即字符的二進制編碼。由於字節為計算機的基本存儲單位,所以通常8個二進制為單位表達字符。
一般在英文狀態下一個字母或字符占用一個字節,一個漢字用兩個字節表示。
字節和字符
字節和字符的轉換根據語言和編碼的不同,它們的轉換關系也有區別:
ASCII 碼中,一個英文字母(不分大小寫)為一個字節,一個中文漢字為兩個字節。
UTF-8 編碼中,一個英文字為一個字節,一個中文為三個字節。
Unicode 編碼中,一個英文為一個字節,一個中文為兩個字節。
ASCII碼
ASCII碼是一種非常常用的編碼,標准ASCII碼用7位二進制編碼,故有128個。而計算機的存儲單位為8位,所以表達ASCII碼時最高D&位通常為0;通信時,D7位通常用作奇偶校驗位。
奇偶校驗(Parity Check)是一種校驗代碼傳輸正確性的方法。
其中標准ASCII碼及其字符表如下所示:
ASCII碼表中的前32個和最后一個編碼是不可顯示的控制字符,用於表示某種操作。
從20H開始(含20H)的95個編碼是可顯示和打印的字符,其中包括數碼、英文字母、標點符號等。
數字0~9的ASCII碼為30H~39H,去掉高4位(或者說減去30H)就是BCD碼。
其中大寫字母和小寫字母之間相差20H(32),所以大小寫字母非常容易互相轉換。
Unicode
ASCII碼表達了英文字符,但卻無法表達世界上所有語言的字符.
Unicode給每個字符提供了一個唯一的數字,不論是什么平台,不論是什么程序,不論是什么語言
Unicode使用16位編碼,能夠對世界上所有語言的大多數字符進行編碼,並提供了擴展能力。Unicode作為ASCII碼的超集,保持了與其兼容。
Unicode的前256個字符對應ASCII字符,16位編碼的高字節為0、低字節等於ASCII碼值。
例如:大寫字母A的ASCII碼值是41H,用Unicode編