原码反码补码疑惑解答记录:127+1=-128

文章目录

  • 前置知识
    • 正数:
    • 负数:
  • 解析


前置知识

正数:

原码符号位为0
原码=反码=补码

负数:

原码符号位为1
反码=原码除最高位以外,按位取反或者负数对应绝对值的原码全部按位取反
补码=反码+1


解析

计算机的运算在其内部是按照补码的形式计算的。
由于减法电路相较于加法电路造价更加昂贵,因此诞生的补码正是为了将减法变为另一种形式的加法而存在的。
补码:将减法运算转化为另一种形式的加法运算

127+1在计算机内 = [127]补+[1][127]= 0,1111111
[1]= 0,0000001
[127]补+[1]= 1,0000000

我们所得到的数最高位为1,因此这是一个负数的补码。
那么这个负数是多少呢?补码不好直接看出其原码形式。

但这时候的推导过程就需要注意了:

反码=`原码除最高位以外,按位取反`或者`负数对应绝对值的原码全部按位取反`
补码=反码+1
也就是补码=`原码除最高位以外,按位取反`再+1或者`负数对应绝对值的原码全部按位取反`再+1

你可以根据上面两种方法的任意一个,推出负数的补码,但是在这里想反着推回去的时候,第一种会出现错误。
两种方法最后都加一了,因此1,0000000-1肯定是没问题的,得到0,1111111
第一种方法:原码除最高位以外,按位取反
得到:00000000,是零
如果127+1就等于了零,这个编码形式的覆盖范围是不是有些小了?因此这种结果我认为是错误的 。

第二种方法:负数对应绝对值的原码全部按位取反
全部按位取反:1,000 0000
什么数的绝对值是128,-128

所以127+1才能得到-128

记得推导的时候不要使用第一种方法,求补码的时候两种方法都可以。

其实也有种负数的补码推回原码的技巧:
寻找从右侧开始的第一个1,将其左侧除符号位以外的所有数据位 按位取反

可以试试:

-8的原码: 1000 1000
-8的补码: 1111 1000

至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!

你可能感兴趣的:(原码,补码,反码,笔记)