一、在计算机中数据是如何进行计算的?
1.1:java中的byte型数据取值范围
我们最开始学习java的时候知道,byte类型的数据占了8个bit位,每个位上或0或1,左边第一位表示符号位,符号位如果为1表示负数,为0则表示正数,因此要推算byte的取值范围,只需要让数值位每一位上都等于1即可。
我们来用我们的常规思维来分析下byte类型的取值范围:
图1
如果按照这种思路来推算,七个1的二进制数转换为十进制是127,算上符号位,取值范围应为:-127~+127,但事实上我们知道,byte的取值范围是-128~127,这里先打个问号,接着往下看。
现在让我们计算下byte类型的7加上byte类型的-2是多少:
图2
诶?跟我们预想的不一样,因为我们是知道7和-2的和应该是5才对,结果应该表示为:00000101,但事实上通过图2的结果来看确实跟预想的不一样,所以计算机在做计算的时候,肯定不是表面上的符号位+数值位的方式进行的计算的。
1.2:原码,反码,补码
我们先来看下定义:
👉 原码定义:符号位加后面的数值,比如图2里的00000111和10000010都是原码,原码比较简单,就是我们在上面单纯理解上的原值。
👉 反码定义:正数的反码就是它的原码,负数的反码符号位不变,其余数值位全部按位取反,例如:
00000111的反码:00000111
10000010的反码:11111101
👉 补码定义:同样的,正数的补码仍然等于它的原码本身,负数的补码等于它自己的反码+1,例如:
00000111的补码:00000111
10000010的补码:11111110
🌴 总结:正数的原码、反码、补码完全一致,负数的反码等于它原码的数值位按位取反,负数的补码等于它的反码+1
现在让我们用反码的方式来计算下图2中的式子:
图3
利用数值的反码计算出的结果已经很接近正确答案了,+4的反码等于它的原码,现在只需要让它+1就是正确答案,还记得补码的定义吗?负数的补码等于它的反码+1,那现在让我们用补码做下计算试试?
图4
ok,我们发现,用它们的补码做加法,得到的数值就是我们想要的正确答案,事实上,计算机并没有减法运算器,所有的减法运算,都是以一个正数加上一个负数的形式来交给加法运算器计算的,由于负数的符号位为1,虽然我们人是知道它的含义,但是作为计算机,它是不知道第一位是符号位的,它要做的就仅仅是让两个数相加而已,正是因为如此,我们才