Re: 請問一個位元運算問題
※ 引述《modester@kkcity.com.tw (兄弟般的bf)》之銘言:
: ※ 引述《LPH66.bbs@ptt.cc (-858993460)》之銘言:
: > 是的
: > 10010110
: > + 00101101
: > ----------
: > 11000011
: > 最高位沒有進位出去 所以 carry flag 為 0
: > 最高位沒有發生 0+0 => 1 或 1+1 => 0 所以 overflow flag 也為 0
: > 結果的最高位是 1 所以 negative flag 為 1
: > 其實 carry 和 overflow 兩個 flag 直接以這個方式來判斷即可
: > 如果以正負數來判斷有時會搞混
: > 因為 carry flag 對應無號數的計算結果
: > 而 overflow flag 則是對應有號數的計算結果...
: 你意思是說沒有第九位,所以overflow flag為0
: 第八位沒有進位(只是1+0),所以carry flag為0
: 進位只看最高位(第八位),其它位元不算嗎?
: 又最高位為1,所以這個加法結果
: A. 若以有號數來看是-67
: B. 若以1補數來看是-60
: C. 若以2補數來看是-61
: 所以negative flag才為1?
: 最後兩句話有點不懂...
如最早的那篇回文 現代電腦一律是 2 補數 所以是 C
negative flag 單純就是看結果以有號數解釋時是不是負數而已
和 carry/overflow 無關
最後兩句話是在說 carry 和 overflow 兩個 flag 的:
carry flag 是無號數相加溢出時設為 1
也就是偵測 180+89=269 >= 256 這種情形
10110100 => 180
+ 01011001 => 89
----------
00001101 => 13
這種情形發生時 最高位會進位出去
所以 carry flag 就在這時設為 1
之所以叫 carry flag 是因為它會用在 multi-word 相加時用來記錄進位
overflow flag 則是有號數相加溢出時設為 1
也就是偵測 80+70=150 >= 128 或 (-80)+(-70)=-150 < -128 這種情形
這兩個例子是:
01010000 => 80 10110000 => -80
+ 01000110 => 70 + 10111010 => -70
---------- ----------
10010110 => -106 01101010 => 106
由於這種情形發生時 最高位會發生符號改變
因此 overflow flag 就會在這個時候設為 1
這樣應該有回答到你的問題...
--
"LPH" is for "Let Program Heal us"....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.137
推
12/03 17:19, , 1F
12/03 17:19, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 8 之 13 篇):