標籤:
第三節 資訊的表示和處理
一. 資訊儲存
1、 位元組
最小的可定址的儲存空間單位,每個位元組由唯一的數字來標識,稱為地址。
2、 進位的表示和轉化
① 十進位轉二進位方法為:十進位數除2取餘法,即十進位數除2,餘數為權位上的數,得到的商值繼續除2,依此步驟繼續向下運算直到商為0為止。
② 二進位轉十進位方法為:把位元按權展開、相加即得十進位數。
③ 二進位轉八進位方法為:3位位元按權展開相加得到1位八位元。(注意事項,3位二進位轉成八進位是從右至左開始轉換,不足時補0)。
④ 八進位轉成二進位方法為:八位元通過除2取餘法,得到位元,對每個八進位為3個二進位,不足時在最左邊補零。
⑤ 二進位轉十六進位
⑥ 方法為:與二進位轉八進位方法近似,八進位是取三合一,十六進位是取四合一。(注意事項,4位二進位轉成十六進位是從右至左開始轉換,不足時補0)。
⑦ 十六進位轉二進位
⑧ 方法為:十六進位數通過除2取餘法,得到位元,對每個十六進位為4個二進位,不足時在最左邊補零。
⑨ 把十進位轉八進位或者十六進位按照除8或者16取餘,直到商為0為止。
3、 布爾代數
布爾代數起源於數學領域,是一個用於集合運算和邏輯運算的公式:〈B,∨,∧,¬ 〉。其中B為一個非空集合,∨,∧為定義在B上的兩個二元運算,¬為定義在B上的一個一元運算。
通過布爾代數進行集合運算可以擷取到不同集合之間的交集、並集或補集,進行邏輯運算可以對不同集合進行與、或、非。
基本規則:
1.a+b=b+a, a·b=b·a.
2.a·(b+c)=a·b+a·c,
a+(b·c)=(a+b)·(a+c).
3.a+0=a, a·1=a.
4.a+a′=1, a·a′=0.
4.補碼
最常見的有符號數的電腦表示方式。
正數的補碼=原碼
負數的補碼=原碼各位取反再加1
最高有效位也叫符號位。
5、 定址和位元組順序
小端法:最低有效位元組在最前面,“高對高,低對低”,是大多數intel相容機,包括IBM和Sun的個人intel相容處理器的電腦使用的規則。
例如:變數x為int,位於地址0x100,十六進位值為0x01234567。
大端法:地址: 0x100 0x101 0x102 0x103
67 45 23 01
在0x01234567中,高位位元組為0x01,低位位元組為0x67。
二、整數表示
1、有符號數和無符號數之間的轉換
對大多數C語言實現而言,處理同樣字長的有符號數和無符號數之間相互轉換的一般規則是:
數值可能會改變,但是位元模式不變。
一個有符號數x和與之對應的無符號數T2Uw(x)之間的關係:
T2Uw(x)= x+2^w , x<0
x , x>=0
2.擴充數位位表示
零擴充:在開頭添0。(將無符號數轉換成更大的資料類型)
符號擴充:添加最高有效位的值的副本。(一個補碼數字轉換成更大的資料類型)
3.截斷數字
可能會改變數值——溢出的一種形式。
對於無符號數字x,截斷到k位,相當於計算:x mod 2(k)。(k次冪)
4.C語言中的有符號數和無符號數
當C語言執行一個運算,若一個運算數有符號而另一個運算數無符號,C語言會隱式地將有符號強轉為無符號,並假設兩者都非負,執行運算。
PS:要想讓負數等於正數,可以讓這個負數和這個正數的無符號形式相等,再在對比時將兩者之一強轉為無符號形式,即可。
5.擴充一個數位位表示
一個常見的運算是在不同字長的整數之間轉換,同時又保持數值不變。當然,當目標資料類型太小了,以至於不能表示想要的值時,這可能根本就是不可能的。然而,從一個較小的資料類型轉換到一個較大的類型,應該總是可能的。要將一個無符號數轉換為一個更大的資料類型,我們只要簡單的在表示的開頭添加0.這種運算被稱為零擴充(zero extension)。要將一個二進位補碼數字轉換為一個更大的資料類型,規則是執行一個符號擴充(sign extension),在表示中添加最高有效位的值。
三、整數運算
1、補碼加法
補碼加法
[X+Y]補 = [X]補 + [Y]補
註:因為電腦中運算器的位長是固定的(定長運算),上述運算中產生的最高位進位將丟掉,所以結果不是100001010,而是00001010。
2、補碼減法
[X-Y]補 = [X]補 - [Y]補 = [X]補 + [-Y]補【1】
3、補碼乘法
補碼的乘法不具備【X*Y】補=【X】補×【Y】補的性質。但是【X*Y】補==【X】補×Y,所得結果再取補碼,如x=101,y=011,[x*y]補=-[(-101)*011]=-[011*011]=-01001=10111
4、乘以常數
在機器運算中,乘法總是很慢的,而加法和移位(左移)是相對較快的。所以在編譯器中,會使用移位和加法運算組合的方式來代替乘以常數因子。這種方法對於無符號運算和補碼運算都是適用的。
常數為2的k次冪的時候直接左移k位即可。
常數不是2的整數次冪的時候將常數C表示為2的幾個整數次冪的和,結合移位元運算和加法運算。
5、除以2的冪
機器運算中,除法比乘法更慢。當被除數為2的整數次冪時,通過右移來解決。右移時需要區分無符號數和補碼。
四、浮點數
1.二進位小數
定點標記法:“.”為界(不能有效表示很大的數)
十進位:小數點左邊的數位權是10的非負冪,得到整數值;右邊的數位權是10的負冪,得到小數值。
二進位:小數點左邊的數位權是2的非負冪,右邊的數位權是2的負冪。
2.IEEE浮點表示
用V = (-1)s * M * 2E的形式來表示一個數:
符號:s決定這個數是負數(s = 1)還是正數(s = 0),而對於數值0的符號位解釋作為特殊情況處理。
尾數:M是一個二進位小數,它的範圍是1 ~ 2-ε,或者是0 ~ 1-ε。
階碼:E的作用是對浮點數據加權,這個權重是2的E次冪(可能是負數)。將浮點數的位表示劃分為三個欄位,分別對這些值進行編碼:
一個單獨的符號位s直接編碼符號s。
k位的階碼欄位exp = ek-1…e1e0編碼階碼E。
n位小數欄位frac = fn-1…f1f0編碼尾數M,但是編碼出來的值也依賴於階碼欄位的值是否等於0。
3.兩種常見的格式
C語言中的單精確度浮點格式float 和雙精確度浮點數格式double。
在float中,s、exp和frac欄位分別為1位、k = 8 位和n = 23位,得到一個32位的表示;
在double中,s、exp和frac欄位分別為1位、k = 11 位和n = 52位,得到一個64位的表示。
遇到問題與解決
為什麼會產生負溢出
解答:通過百度和參考書上的例題知道,和正溢出一樣,只要超過了這個資料的位元組數,則會溢出,只是正溢出是正值,負溢出是負值超出了下限。
第三節 資訊的表示和處理