概述
今天开始看阿里的<<码出高效: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
总结:
- 要区分正数和负数:最左边的是符号位,0代表正数,1代表负数
- 正数的反码和补码都与原码相同。
- 负数的反码为对该数的原码除符号位外各位取反。
- 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加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
如果直到一个负数的补码,如何直到原负数值呢?
如负数的补码为11111110
则最左位表示负数,右7位值取反加1得到的是负数的绝对值:-(0000001+1)=-2;
题外话:
小心结果溢出,如果计算结果需要9位保存,而我们只有8位,这个时候就出现结果溢出的问题,即在数据运算的过程中,超出规定的表示范围。一旦溢出,计算结果就是错误的,所以在各个编程语言中规定了不同数字类型的表示范围,有相应的最大值和最小值。
最后
以上就是醉熏烤鸡为你收集整理的原码,反码,补码的简单理解的全部内容,希望文章能够帮你解决原码,反码,补码的简单理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复