- 老师答疑区
- 帖子详情
5
回复
-
<p>同问<br ></p><p>按照补码逆运算不就变正数了吗(如图一)</p><p><img src="//nos.netease.com/edu-image/db48e3f0-c4f0-478d-adf6-106f374f0732.jpg" style="width: 696px; height: 251px;" />后来查询了一下,<a href="https://www.cnblogs.com/youxin/archive/2012/07/03/2575504.html" target="_blank" >原码,补码,反码相互转化</a>中说:<p><code class="brush:html;toolbar:false" >按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1的方法</code>但仍然算不出(如图二)</p><p><img src="//nos.netease.com/edu-image/57228004-732a-415c-9c1c-25671750c557.jpg" style="width: 702px; height: 247px;" /></p><p><br /></p><p>求解</p></p>添加评论
-
<p>按你的说法,原码都溢出了,怎么是-2的15次方呢?</p><p><br ></p>添加评论
-
因为有符号数中0000000000000000已经表示0了,正0负0一样不用重复表示,所以就用1000000000000000来表示-2的15次方。添加评论
-
<p>这个问题开课以来一直没人问,其实是个很深入的问题。-2^15属于边界数,直接表示是无法计算的,因为-2^15的原码已经超过16位有符号数能表达的范围,这样的数是有特殊设定的。我们可以从比-2^15-1的表示来推算:</p><p>-2^15-1的原码是 1 111 1111 1111 1111,其中第一个1是符号位,其他为数值位。</p><p> 反码是 1 000 0000 0000 0000</p><p> 补码是 1 000 0000 0000 0001</p><p>那么-2^15-1与-2^15的关系如何呢?</p><p>-2^15-1的补码应该比-2^15大1,因为补码不改变数的大小关系,所以-2^15的补码应该是 1000 0000 0000 0000</p><p>(如果你想了解的更深入,可以看下验证过程。</p><p>我们知道,补码运算的减法运算是将减法转换成加一个负数,所以-2^15-1 - 1 相当于 -2^15-1 +(-1)</p><p>-1的补码是 1 111 1111 1111 1111</p><p>因此-2^15-1 + (-1)应该是 1000 0000 0000 0001 + 1 111 1111 1111 1111 = ·1 1 000 0000 0000 0000</p><p>可以看出运算时发生了溢出,最高位是第17位,被自动舍掉,因此变为 1 000 0000 0000 0000,就是-2^15对应的补码</p><p>)</p>
-
太大溢出了添加评论