2.74
寫出具有以下原型的函式**:先捋一捋需求:/*addition that saturates totmin or tmax */
int saturating_add(int x, int y);
同正常的補碼加法的溢位的方式不同,當正溢位時,飽和加法返回tmax,負溢位時,返回tmin,飽和運算常常用在執行數字訊號處理的程式中。
你的函式應該遵循位級整數編碼規則。
1、若發生正溢位:返回tmax;
2、若發生正溢位:返回tmin;
3、題目雖然沒說(或者我理解有誤),但若沒有發生溢位時也應該有個返回值,返回0;
再捋一捋規律:
1、補碼相加發生正溢位時,兩個引數一定都大於0;
2、補碼相加發生負溢位時,兩個引數一定都小於0;
3、判斷溢位的方法是,當兩個引數的符號符合溢位條件時,檢測其相加的結果符號是否發生改變;
再捋一捋思路:
為了方便描述,定義乙個引數:int result = x + y ;
1、規律1和2是發生溢位的必要條件,可以通過算術右移的操作生成只保留符號資訊的二進位製碼——0x0(全0)或全1,然後將兩個引數的符號資訊按位異或(xor),若符號相同(即滿足了發生溢位的條件),異或操作後生成的二進位製碼會是0x0;到這裡,再對結果取非,因為發生溢位的條件是溢位的必要條件(好廢話啊= =!),這是為了讓這個二進位製碼能通過按位與的操作左右最終的結果。
2、規律3是發生溢位的另乙個條件,隨便取乙個引數,同樣通過算術右移的操作只保留符號資訊,然後對result同樣進行算術右移的操作以獲取符號資訊,再將結果按位異或(xor),若符號發生改變,會返回全1。
3、根據result的符號資訊決定返回tmin還是tmax,我的思路是用result的符號資訊(全0或全1)減去tmin,發生溢位時有以下幾種情況:
溢位的情況
result算術右移後的結果
我想要的結果
result符號資訊減去tmin
正溢位全1
tmax(最高位是0,其餘全1)
tmax
負溢位全0
tmin(最高位是1,其餘全0)
tmin
可以看到通過符號資訊二進位製碼減去tmin的操作可以得到預期的結果
4、將1、2、3的結果相與,得到最終的返回值;
ok,廢話完畢,talk is cheap,show me the code:
int
saturating_add
(int x,
int y)
測試**
(為了偷懶,我把所有家庭作業寫進了同乙個原始檔,測試的時候用的同乙個main()函式,所以我直接貼圖了):
1、兩正相加不溢位
2、兩負相加不溢位
3、負溢位
4、正溢位
寫出具有以下原型的函式**:需求:/determine whether arguments can be subtracted without
overflow/
int tsub_ok(int x,int y);
如果計算x-y不溢位,這個函式就返回1。
1、兩個引數相減,不溢位返回1.
規律:1、兩個引數相減,符號不同一定不溢位
2、兩個引數相減,溢位的結果符號一定改變
3、負數被減只能正溢位,正數被減只能負溢位
思路:1、參照2.73的經驗,同樣對引數進行算術右移只保留符號資訊,然後相異或,只有異或的結果若為0,才滿足溢位的條件,所以再對異或的結果取非,最後的二進位製碼為全1的時候才滿足溢位的條件
2、根據思路3,對相減的結果result進行同樣的算術右移操作,然後對被減數y也進行同樣的算術右移操作,保留符號位,兩者相異或,若返回0,則說明發生了溢位。
x的符號
y的符號
result的符號
溢位/不溢位11
0或1不溢位10
1不溢位10
0負溢位01
1正溢位01
0不溢位00
0或1不溢位
the code:
int
tsub_ok
(int x,
int y)
測試**
1、最極端的情況,tmin-tmin:
2、兩正相減(一定不溢位):
3、兩負相減(一定不溢位):
4、正負相減(結果預期:不溢位/溢位):
5、負正相減(結果預期:(不溢位/溢位)):
踩坑:做2.74的時候,我的第乙個方案是直接對y取負值(即令y = - y;),然後再與x相加(result = x+y;),就可以套用2.73的部分**來操作,但是當y值為tmin時,沒有對應的-y,所以行不通.
這是我寫的第一篇部落格,乙個人看書敲**很無聊,所以試著把學習的心得寫成部落格分享出來。
最後,本人非相關專業從業者,**與思路有拖沓冗餘之處,請多多指教,感激不盡。
異常 深入了解計算機系統
異常是異常控制流的一種形式,它一部分由硬體實現,一部分由作業系統實現。因為它們有一部分是由硬體實現的,所以具體細節將隨系統的不同而有所不同。然而,對於每個系統而言,基本的思想都是相同的。在這一節中我們的目的是讓你對異常和異常處理有乙個一般性的了解,並且向你揭示現代計算機系統的一乙個經常令人感到迷惑的...
深入理解計算機系統第二章家庭作業
2.91遵循位級浮點編碼規則,實現具有如下原型的函式 compute f if f is nan then return f.float bits float absval float bits f 對於浮點數f,這個函式計算 f 如果f是nan,你的函式應該簡單地返回f。測試你的函式,對引數f可以...
2021 1 28深入了解計算機系統第2章個人總結
位運算 邏輯and,00 可以通通置零,11.可以用來保留指定位 邏輯或 由於其只能由0 1和1 0得1的性質,所以要想在0和非零數之間找到非零數,用 即可 邏輯異或,感覺有點像 的補集 邏輯非,對於所有位,0取1,1取0,x 1 x 阿貝群 非位運算 類似 但是它不是針對位運算,0取1,非0取0 ...