原码,反码,补码的简单理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/84673181

今天开始看阿里的<<码出高效:Java开发手册>>,头一章便是计算机基础。计算机的基础世界一切都是由0和1组成。

既然是0和1的世界,肯定就逃不了原码,反码跟补码的使用。
首先我们直到一个byte代表一个字节,有8位。

如果用byte即8位存储一个数字的话那范围是多少?

答案是:-128~127.

扩展一下:

Integer i1 = 100;
Integer i2 = 100;

Integer i3 = 200;
Integer i4 = 200;
System.err.println(i1 == i2);
System.err.println(i3 == i4);

第一个会打印true,第二个会打印false。
这是什么原因呢,原来在JDK1.5中对整形数据采用了缓存,缓存-128 ~ 127范围的数据。

回到正题:

为啥会有原码,反码,补码的概念呢?
因为加减法是高频运算,使用同一个运算器,,可以减少中间变量存储的开销也降低了CPU内部的设计复杂度,所以我们将减法转换成加法运算,比如1-2转换为1+(-2).

而原码,反码,补码的存在就是为了解决其中的问题。
关于原码,反码,补码的介绍与应用,网上已经有了很多优秀的详解,我这里就不多累赘了,直接贴网址了,就这么直接(好吧,我懒)
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

总结:

  1. 要区分正数和负数:最左边的是符号位,0代表正数,1代表负数
  2. 正数的反码和补码都与原码相同。
  3. 负数的反码为对该数的原码除符号位外各位取反。
  4. 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

注意:如果没有补码,只有反码的话,0的表示有两个:0000 0000和-0000 0000
所以出现了补码:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

所以对应一开始的问题如果用8位存储01的话 范围是-128~127,
其中0000 0000代表0,-0000 0000代表-128

题外话:
小心结果溢出,如果计算结果需要9位保存,而我们只有8位,这个时候就出现结果溢出的问题,即在数据运算的过程中,超出规定的表示范围。一旦溢出,计算结果就是错误的,所以在各个编程语言中规定了不同数字类型的表示范围,有相应的最大值和最小值。

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/84673181