补码符号位能够参与运算?的个人理解

在学习二进制计算时,实际计算机中使用补码来存负数,从而将所有的减操作都化为加操作,我当时有个疑问,为什么能够带带符号操作室所有的符号位都能被正确的表示出来,

参考大佬的 https://blog.csdn.net/qq_45472866/article/details/114779170
大佬点出了,补码没有负数。

-还需要了解, 补码的由来是什么
参考https://blog.csdn.net/u010405836/article/details/102923564?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162454715416780271589659%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162454715416780271589659&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-5-102923564.pc_search_result_cache&utm_term=%E8%A1%A5%E7%A0%81%E7%9A%84%E7%94%B1%E6%9D%A5&spm=1018.2226.3001.4187

以8位2进制数为例子。

补码对于正数来说 是正数本身 加上符号位0 也还是正数本身
补码对于负数来说 就是到底是什么, 负数是带有符号位的,那么补码 就是对于这个8位数的模 - 负数的数值部分杜对8位二进制数来说 负数 就是 256(1000 0000) - 数值部分(也就是将负数的符号位变为0)

下面考虑,在具体计算过程中,带上符号位,会有什么结果。
首相我们要将一个数分成,符号位,和数值位 2部分计算。

1.两正数相加 不存在符号位的问题
由于0表示正号。 对应的两个正数相加,符号位不会发生变化。也就意味着正数符号位参与计算可行。

2.一个正数 与 一个负数相加时如何确定符号位。(以8位2进制数为例子。 )
由于负数使用补码的表现形式。 例如:10-2 中。 我们是实际上是使用 10的 补码 0 000 1010 + -8的补码
而-8的补码 其实又是(模 - 负数数值部分的原码)也就是用 1000 0000 - 0000 1000
那么其计算过程 就可以改变为
正数的原码 + 模 - 负数数值部分的原码

变形为: 模 +(正数原码 - 负数数值原码) = 结果值
在带入符号计算时,其实符号相加默认为1(表负数)
如果此时,正数 大于 负数 ,那么结果值 就是模+一个数。而模这个是本身就是相当于一个进位。
如果此时 正数 小与 负数 ,那么结果值,就会小与 模本身 ,从而不发生进位,表示这个值 是一个负数的补码。由于不进位,符号位的默认结果 又是负的。

3.当两个数都是负数的时候,理论上结果一定是负数。
但是在实际计算中,两个负数的符号位,默认值是0
两个负数使用补码相加,实际上等于
(模-负数数值部分源码)+(模-负数数值部分源码)= 结果值
又由于 那么就等于 2模 - (负数数值部分原码+负数数值部分原码) = 结果值

那我有可能出现2中情况,

  1. 0<结果值<1模(此时符号位为0,结果为正数,必然不正确)
  2. 1模<结果值<2模(此种情况通过完成进位,实现符号位由0变1,运算结果正确)

通常理解的补码
10的 补码 01010
-8的补码 10111+1

实际上计算机中补码
10 的补码 0 000 1010
-8的补码 1 111 0111

计算过程 符号位的计算 结果是1 ,我们需要通过数值位的计算来判断是否真为1.(负数)
0 000 1010 + 1 111 0111 不带符号位计算时 =
0 000 1010 (正数数值部分补码) + 1000 0000(模) - 0 000 1000(负数数值部分补码)
如果 满足正数部分 大于负数部分,那么必然,这个模就存在,就发生进位 ,使得符号位的1 需要加上数值位的进位1 结果为0

那我们我们计算 -8 - 10 的时候
实际计算机中补码
-8的补码 1 111 1000
-10的补码 1 111 0110

符号位计算结果默认为0
通过数值位的计算 判断结果是否真为0
1000 0000(模) - 0000 1000(-8数值位补码) + 1000 0000(模) - 0000 1010(-10数值位的补码)
当两数值位 结果在 1模 到2 模之间, 结果就是存在一个模的进位。
那结果就是负数,此时符号位参与运算正确。

当两数值位较大。使得结果小于1模,那么就意味着。这个结果不正确,不正确的原因是超过,取值范围。

出现这种情况, 是因为,负数的补码,是需要模的配合才有意义的。对于同一个负数。
8位为进制数的补码。和 16位二进制数的补码 实际上在参与运算时,是不一样的。
以-10为例子、
8位二进制数的补码 使用 1 111 0110
16位二进制数-10的补码 使用 1 111 1111 1111 0110

而+10 的8位二进制数的补码 0000 1010
而+10 的16位二进制数的补码 0000 0000 0000 1010
我的理解是,实际上是通过模来配合符号位运算,确定符号位是否正确的。

写着写着,就感觉符号位能直接参与运算,
正数在符号位参与运算时, 时候补码过大,也会导致溢出,变成 负数。

查看资料,发现,实际上是使用双符号位的方式来检测溢出的。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值