程式設計師視角的計算機系統 2.3 整數的算術
許多程式設計師的新手驚訝於兩個正數相加返回了負數的發現。還有x2.3.1 無符號的加法
考慮兩個非負的整數x,y,例如 0<=x,y<=2^w-1.這兩個數都能表示為w位長的無符號數。如果
我們計算它們的和,然而,我們有乙個可能 的範圍是0<=x+y<=2^(w+1)-2. 表示這個和需要w+1
位長度的二進位制位元。例如對於4位位元的數的和,引數的範圍在0到15,和的範圍在0到30。
我們維護的和是w+1位長的,再加上它到其它的值,我們可能需要w+2位長度,等等。這種持續性的
字大小的膨脹,意味著我們為了完全地表示結果的大小,不能設定字大小的邊界。一些程式語言
例如lisp,實際支援無限精度的算術,來允許隨意長度的整數的算術。更常見的是,程式語言支援
固定精度的算術,因此,操作例如加法和乘法不同於它們在整數上的相應的操作。
無符號的算術被視為是模算術的一種形式。無符號的加法等價於計算和再對2^w取餘。
這個值能被以簡單地丟掉x+y 的w+1這個是最高位,來計算。例如,考慮乙個4位長的數,
x=9,y=12,它們的二進位制表示為和它們的和是21。二進位制是
但是我們丟掉它的最高位,我們得到了,也就是十進位制的5。這與21%16=5是匹配的。
總之,我們能看到如果 x+y<2^w,和的最高位是0,因此丟掉最高位後,結果不變。
另乙個方面,2^w<=x+y<2^(w+1),這導致最高位是1,因此丟掉最高位等價於
從和中減掉了2^w。
公式如下圖2.11所示:
練習問題2.27
寫乙個如下的原型的函式:
int uadd_ok(unsigned x,unsigned y);
這個函式應該在兩個引數相加沒有溢位時,返回1。
模加法形成了乙個數學結構,叫做阿貝爾群,以丹麥數學家阿貝爾的名字命名。它有
交換律和結合律,它有乙個零元,每個元素都有乙個加法的逆元。對於每個x!=0時,
它的逆元是2^w-x,x=0時,逆元是0。如圖2.12
練習問題2.28
我們能表示乙個位長為4的十六進製制的數字。對於乙個無符號的數字,使用這個方程,
填寫如下的**的空白處。
x u4x
________________ __________________
十六進製制 十進位制 十進位制 十六進製制
————————————————————
0 _________ _________ _________
5 _________ _________ _________
8 _________ _________ _________
d _________ _________ _________
f _________ _________ _________
程式設計師視角的計算機系統 2 2 整數的表示
程式設計師視角的計算機系統 2.2 整數的表示 在這一部分中,我們描述用位元來編碼整數的兩種不同的方式。乙個僅能夠表示非負的整數。另乙個能夠表示所有的整數。我們將看到它們的數學性質與它們的機器級別的實現是高度相關 的。我們也調查研究了在適合不同的長度的表示時的擴充套件與收縮乙個編碼過的整數的效果。2...
程式設計師視角的計算機系統 2 1 2 字
程式設計師視角的計算機系統 2.1.2 字 每個計算機都有乙個字的大小,顯示出整數和指標資料的名義上的大小。因為乙個虛擬位址 被這樣的乙個字進行編碼,字的大小確定的最重要的系統引數是虛擬位址空間的大小。也就是 對於乙個機器而言,乙個w位長的字大小,虛擬位址的範圍是從0到2 w 1,程式能讀取的最多 ...
程式設計師視角的計算機系統 1 5 緩衝問題
程式設計師視角的計算機系統 1.5 緩衝問題 從這個簡單的例子上的乙個重要的課程是乙個系統花費了大量的時間來把資訊從乙個地方 移到另乙個地方。在你好程式中的機器指令剛開始時儲存在磁碟中。當程式被載入時,它 們被複製到記憶體中。當處理器執行程式時,指令從記憶體複製到處理器中。相似的是,資料 字串 he...