第三節 資訊的表示和處理

來源:互聯網
上載者:User

標籤:

第三節 資訊的表示和處理

一.   資訊儲存

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位的表示。

 

遇到問題與解決

為什麼會產生負溢出

解答:通過百度和參考書上的例題知道,和正溢出一樣,只要超過了這個資料的位元組數,則會溢出,只是正溢出是正值,負溢出是負值超出了下限。

 

第三節 資訊的表示和處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.