求补码的简便方法及byte溢出问题

今天兴起翻了翻Java课本看到这么一段话“要得到-8的补码,首先得到7的原码,然后将7的原码中的0变成1,1变成0,就是-8的补码”,以往求补码,都是遵循由原码得到反码,再由反码得到补码的步骤,这种方法引起了我的兴趣。

首先借助大神的博客补习一下原码反码补码的概念http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

另外要注意0的原码反码和补码,计算机辨认0需要分正0和负0,所以(8位表示,以下讨论皆为8位)原码:(+0)00000000 (-0)10000000   反码:(+0)00000000  (-0)11111111 补码:00000000,此时你可能疑惑,补码10000000表示的数是多少,不卖关子了,是-128,而-128没有原码和反码。

了解完背景现在正式分析:-1的原码为10000001,反码11111110,补码11111111。前边已经知道计算机中是用补码计算的,很容易知道-8+7=-1,即-8的补码+7的补码=-1的补码,7的补码就是7的原码,也就是-8的补码+7的原码=-1的补码,所以-8的补码+7的原码=11111111,显而易见7的原码中的0变成1,1变成0,就是-8的补码。这样一来求负数的补码可以借用比此负数绝对值小1的正数进行简便计算,即(|x|-1)的原码0变1,1变0

由于计算机采用补码计算,产生了一些有意思的问题,如byte溢出问题,解决byte溢出问题可以通过补码按部就班的分析,也可以利用循环规律,这儿附另外一个大神总结的口算方法http://m.blog.csdn.net/article/details?id=44919993



猜你喜欢

转载自blog.csdn.net/huazicomeon/article/details/71082656