这样给小白讲原码、反码、补码,帮她彻底解决困扰了三天的问题 (3)

对于补码,你确实无法直接看出它是多少,负数或许理解起来可能还有那么一点点抽象,我们该如何理解补码呢?
我是这么理解的:二进制数把数据分为正负两个部分,分别表示两个区间:

image-20210524000911217


什么意思呢?这个也就是说你可以把负数看成一部分,正数看成一部分。而每个部分的数值也是相同的:无论负数还是正数出去符号位,都是从 000 0000~111 1111(byte为例)分布。如果前面符号位为1就是表示负数,负数的最小到最大(-128 ~ -1)共128个,如果是0就是正数的最小和最大(0 ~ 127)共128个。这样理解是不是容易很多呢!

测试

上面讲了那么多道理,咱们测试一下吧,用以下代码验证上述结果

//微信公众号:bigsai public class Main { public static void main(String[] args) { int a =-1;//11111111 11111111 11111111 11111111 int b=1; //00000000 00000000 00000000 00000001 System.out.println(Integer.toBinaryString(a));//输出-1的二进制 System.out.println(Integer.toBinaryString(b));//前面的0会省略 /* * 127 + 1: * 0111 1111 * +0000 0001 * =1000 0000 = -128 */ byte c=127; byte d=(byte)(c+1); System.out.println(d); /* * -1+1 * 1111 1111 * + 0000 0001 * =10000 0000(理论上) = 0000 0000(只有8位有效位) =0 */ byte e=-1; byte f=(byte)(e+1); System.out.println(f); } }

输出结果:

image-20210524005426645


这段代码意会巩固以下就好了。

总结

到此,是不是对原码、反码、补码理解更透彻一点了呢?不管你懂没懂,反正问她懂了吗她是这么说的:

image-20210524003300071

总结一下:

原码,能够直接的显示数值的大小状况。结构为符号位+数值部分。符号位0代表正,1代表负。

反码,是一个过渡码,其实就是在求补码或者原码补码转换过程中需要用到。其规则是正数反码等于原码,负数反码符号位不变,数值位0变成1,1变成0.

补码,计算机中数值都是以补码的形式进行计算的,它有效的解决负数加法问题,也可以使符号位直接参与运算。并且原码、反码、补码转换很简单。

好了,本篇已经结束了,希望有收获后点个赞、收藏、关注,持续分享。

关于作者
江科大本,南理研一,普通草根程序员,同名公众号:[bigsai],致力于将基础数据结构与算法、Java等相关知识搞懂。欢迎交流学习、考研、选择等技术问题。

image

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydxss.html