作者g1990822 (什麽东西?!)
看板Grad-ProbAsk
标题[理工] 如何判断二补数运算完後是正还是负?
时间Sat May 30 19:38:51 2020
(代po)
最近在复习二进位减法的时候有一个地方卡了两三天
感觉这问题很简单但是我脑袋一时转不过来..
问题就是:要如何判断二进位用二补数算完後的结果到底是正数还是负数?
我记得之前上计概的时候,学校老师说(还抄在我的笔记上..):
(1)最高位元无进位表示结果为负,
若要转为十进则要用将值以取反2补数还原为负数
而若最高位元有进位时表示结果为正,该进位直接舍弃
例如:算十进位的11-21 => 11 + (-21) =>要把21取2补数再和11相加
11的二进位为:0000 1011
21的二补数为:1110 1011
则: 0000 1011
+) 1110 1011
-----------------------
1111 0110 =>没有进位,表示结果为负,1111 0110再取一次二补数
=>1111 0110取二补数 = 0000 1001 也就是10,所以答案=-10 没问题
符合老师上课说的
但是我看到一个反例
如果是 -15-25=>(-15) + (-25) => -15和-25都取二补数并且相加
-15的二补数为:1111 0001
-25的二补数为:1110 0111
则: 1111 0001
+) 1110 0111
-----------------------
1 1101 1000
|
这个1进位了!
有一个进位的1,如果照老师说的规则,那这个结果应该是正的
但是结果却是-40,是负的
也就是要把算完的结果(1 1101 1000)整串再取一次二补数然後再加负号
才会变成-40
所以我就有点被搞混了..
在电脑中,如果要"以运算後的结果"来看是正数还是负数,到底该怎麽看呢?
(也就是假设我们一开始不知道这两个数运算完後到底是正还是负,单纯以结果来看)
再麻烦各位替我解答一下了
这里我卡了好多天 一直想也想不通 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.43.134.169 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Grad-ProbAsk/M.1590838733.A.220.html
※ 编辑: g1990822 (114.43.134.169 台湾), 05/30/2020 19:49:18
1F:推 cossetannie: 看最高位有没有进位只是考虑有没有发生overflow 05/31 00:29
2F:→ cossetannie: overflow那结果当然不会对 05/31 00:30
3F:推 cossetannie: 上面好像讲错了 忽略掉吧 如果你只是单纯要看正负数 05/31 00:40
4F:→ cossetannie: 直接看sign bit就可以了吧 应该跟进不进位没什麽关 05/31 00:40
5F:→ cossetannie: 系 05/31 00:40
6F:→ chengaryguan: 若正加正变负,或附加负变正,才考虑overflow,但以 05/31 00:45
7F:→ chengaryguan: 你的举例,负加负仍为负,因此直接不用管overflow的 05/31 00:46
8F:→ chengaryguan: 那个bit,後面的11011000就是-40在2补数的值了。 05/31 00:46
所以这两位大大的意思是
做完补数运算後=>"利用进位"先看有没有overflow
=>没有overflow的话直接看原本的答案来判断就好吗?
像是我举的第一题: 11+ (-21) = 1111 0110
=>"没进位"也没有overflow
=>答案就是1111 0110
=>把1111 0110做二补数加负号=>-10(十进位)
第二题: -15 + -25 = 1 1101 1000
|
进位的1
=>最左边有一个进位的1
=>"有进位"但是没有overflow
=>答案就是 1101 1000(不管进位的1了)
=>把1101 1000做二补数加负号=>-40(十进位)
简单来说就是,做完运算之後,"不管有没有进位","只要没有overflow",
那答案就是直接这样算就好了吗?
谢谢
※ 编辑: g1990822 (61.230.5.114 台湾), 05/31/2020 03:11:07
9F:→ chengaryguan: 是的,电脑判断正负就靠最左边的bit为0或1,因跐当o 05/31 09:45
10F:→ chengaryguan: verflow等那个bit运算完与结果的最左边的bit相同(s 05/31 09:45
11F:→ chengaryguan: ign bit),表示没有发生overflow,结果就是正确的, 05/31 09:45
12F:→ chengaryguan: 以你的例子就是後面那个8个bits直接当结果。 05/31 09:45
13F:推 cossetannie: 进位应该是用来判断unsiged运算的结果正确与否 05/31 10:17
14F:→ wildwolf: 没有人发现 8-bit 表示正负数的时候,没有表示 -40 的方 06/01 08:29
15F:→ wildwolf: 法吗?一开始就要多一bit signed extension 计算 06/01 08:30
16F:→ cossetannie: 11011000不是-40吗 06/01 11:09