作者LPH66 (-858993460)
看板Programming
标题Re: 请问一个位元运算问题
时间Fri Dec 3 11:41:24 2010
※ 引述《[email protected] (兄弟般的bf)》之铭言:
: ※ 引述《[email protected] (-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
1F:推 cooper6334:有号数溢位:正+正=负or负+负=正 111.252.67.128 12/03 17:19