关于补码的一些见解和求补码的三种方法



计算机系统的内部是以二进制形式存储数据。在java程序中输入的十进制数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制。在计算机系统中,数值一律采用二进制的补码来存储。二进制的最高位是符号位。0表示正数,1表示负数。正数的值是其本身,负数的值是最高位(符号位)不变,其他位逐位取反再加1。

我们以四位二进制为例,来讲解一下四位二进制能表示的补码范围。首先在计算机中为什么会引入补码,原因就是引入了负数的概念,为了表示方便而引入了补码。有了补码可以将符号位和其他位统一处理。

如果不采用补码来存储数据。四位二进制在计算机中的表示方式为:0000000100100011010001010110011110001001101010111100110111101111共2的4次方16个数。表示范围为0-15。

那么如果在计算机中存负数应该怎么表示呢,在计算机中是无法识别“-”负号的。而且计算机只能识别0、1两种状态。所以说用0代表整数、1代表负数(为什么不用0代表负数,1代表正数这就要问科学家们了)。

所谓补码也不是很难理解。因为对于四位二进制数,在计算机中也只有上面列举的16种表示方式。原码的意思是上面的16种表示方式全代表是整数。而补码则是:上面的16种表示方式有一半表示正数,一半表示负数。这种表示形式就是补码。16种状态没有变,变得只是16种状态表示的值变化了。

由上面图的规律不难发现,“0”开头的二进制数共8个,“1”开头的表示的有8个。所以恰巧00000001001000110100010101100111表示正数。

10001001101010111100110111101111表示负数。最高位不再表示数值,而是作为符号位,即一半0到正数,一半数负数。

    那么接下来的问题是,表示负数的这8组二进制数分别表示的负数几?首先看图,你可以把这16种状态当成一个时钟,本来是从0000-1111循环表示16个数,现在为了表示负数,以0为分界点。01等于负1,也就是1111。其余按照规律就不难发现:

1000=8   (原本代表8  8+|8|=2^4=16

1001=7   (原本代表9  9+|7|=2^4=16

1010=6   (原本代表10 10+|6|=2^4=16

1011=5   (原本代表11 11+|5|=2^4=16

1100=4   (原本代表12 12+|4|=2^4=16

1101=3   (原本代表13 13+|3|=2^4=16

1110=2   (原本代表14 14+|2|=2^4=16

1111=1    (原本代表1515+|1|=2^4=16

正数就不一一列举了。4位二进制共16个数,用补码表示,一半是-1~18。现在四位二进制补码表示的范围为:—8~7

所以不难发现规律:假设让你求—5的补码。

2^4|5|=11=1011

同学们可以自己琢磨一下。这里只提供些许参考建议。有一些求补码的简便算法也是根据最基础的东西得来的,大家只需要记住就行不用深究。

求补码的三种方法:

方法1:

根据原理求补码,根据前面总结的规律,假设用四位二进制表示,首先如果四位全表示数值,则4位二进制的表示范围是0~15共16个数。如果四位二进制最高位表示符号位,那么它表示的范围是-8~7也是16个数。有个规律是:采用最高位表示符号位时负数的补码对应的值得绝对值与四位二进制全表示数值时的码对应的值相加等于四位二进制能表示的个数。

例:1000=8   (原本代表8  8+|8|=2^4=16

根据这个规律可以求补码:

例:求-7的补码

  1. 首先思考-7在四位二进制表示的范围内(也可以用8位等,原理一样,但不能用3位、2位因为表示不了-7),所以用四位二进制可以表示,表示的个数为16

  2. 然后用16-|-7|=9

  3. 这时候直接用四位二进制表示出9就可以了。结果为:1001

方法2

根据先写出对应的原码,然后符号位不变,除符号位外逐位取反,最后再加1

例:求-7的补码

  1. 先写出-7的原码:1111——1(符号位)111(数值位)

  2. 除符号位外逐位取反:1000

  3. 最后再末尾+1:1000+1=1001

方法3

根据:先写出对应的原码,然后根据原码从右往左找出第一个1,这个1不变,符号位不变,1左边的全部去反,右边的也不变。

例:求-7的补码

  1. 先写出-7的原码:1111——1(符号位)111(数值位)

  2. 从右往左找到第一个11111

  3. 符号位不变,右边的不变,左边的全部取反——1001

作者:吴玉婷
更新日期:2021/6/7
如有问题请指出,感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值