1.2、java.lang(精读部分)

心已入冬 提交于 2019-12-25 19:39:19

我们都知道java.lang是java的核心包。
现在我们开始阅读lang包的一些东西。

byte

在这里插入图片描述
byte类是final类。也就是说它是不可以被继承的

还有就是经典的“127和128”的问题了(图懒得换了…MAX_VALUE = 127

java中,byte是一个字节占八位。

12701111111)127(01111111)
在加一,出现什么情况?计组原理中说过第一位是符号位(0正1负)
在这里插入图片描述
第一个:int+byte;
第二个:byte+byte(+=的特性)越界:

在计算机中,由于原码的表示不便,进行运算需要判断其正负极其绝对值的大小。所以,在计算机中,通常都是采用补码形式。 正整数的补码与原码形式相同,正数的原码反码补码相同,负数的补码=反码(反码=原码的符号位不变其他位取反)+1

12701111111)127(01111111)+100000001)1(00000001)得到1000000010000000

1000000010000000,按照计算,这个不应该是-0吗?为什么是-128呢?

首先灌输一个新的概念叫,模
什么是“模”,想象日常使用的钟表,它可以显示0~12点的时间,假设现在是2点钟,请用手动拨动时针的方式将时间减4小时,你会怎么做?

有两种方式:
逆时针将时针拨4小时,
顺时针将时针拨8(12-4)小时

这里要讲的是第二种方式,为什么顺时针拨12-4也可以达到和正常思维的第一种方式一样的位置。12就是模。同样的,如果是十进制的两位数,80-10 和 80+90在不考虑百位数的基础上都是70。这里的90就是100-10得来的,这种情况下100就是模模就好比是一个极限,在它的范围内,两个相加等于模的数互为补数,还是举100的例子90和10, 55和45,68和32,互为补数在模的范围内做减法,可以将“X-Y”的减法变更为“X+Y的补数“的加法,当然前提是不考虑百位数

思考题,上面举的例子是大数减小数,那么如果是小数减大数会怎么样呢?如果是10-80,结果应该是-70,但如果按照10+(100-80),结果是30。而很明显-70和30不是一回事,这里也没有百位数的问题,这种情况应该怎么破?

当初的那些先贤们想出来的办法很简单,就是把这两个数直接划上等号,正好顺便解决了负数的表达方式。再来仔细看看这两个数的关系:-70绝对值的补数就正好是30所以在计算机中,负数的表达方式就是它绝对值的补数但是问题又来了,看起来这个解决方式很完美了,但别忘了,30他已经代表了正数的30了,现在又要用来代表负数的-70,谁知道它出现的时候到底是代表哪个数?

为了解决这个问题,需要给这套规则划定一个范围,原来是0~99的正数,现在既然要用部分正数来代替负数了,那就要规定一个范围来使得一个数只代表一个含义,正好一人一半,0~49这个区间就代表正数,50~99的区间就用来代表各自补数的负值,例:98就代表 -2

第三步,现在回到二进制的计算机世界8位二进制数一共可以表示2的8次方,256个数,即0~255 (别忘了0也要占一位的),他们的极限就是256,即256是8位二进制数的模 ,应该不难理解吧,同上十进制的两位数0~99的模是100。还是用二进制来说明清楚,8位二进制能表示的数的极限是1 1 1 1 1 1 1 1, 就是255,在这基础上加0 0 0 0 0 0 0 1,出现了进一位 即 1 0 0 0 0 0 0 0 0这个1 0 0 0 0 0 0 0 0就是8位二进制数的模,256同样按照第二步讲的逻辑,一半的数0~127,代表其正数本身,另一半的数 128~255,代表其补数的负值,即“-1~-128”的区间。 而 “X-Y”的减法 就用 “X+Y的补数” 的加法来表示,完美! 唯一需要注意的事情是任何计算的输入值和输出结果值都需要严格遵守-128~127的范围,一旦溢出就会报错。这也就是我们在编程里强调的为什么 byte+byte还得是byte,int+int还得是int,数据溢出问题也是每一个程序员都需要注意的问题。这样一说是不是可以理解-128的补码是怎么来的了吧? 他就是256-|-128|=128二进制的128是不是就是1 0 0 0 0 0 0 0 ?

最终问题,那书和老师为什么要用原码,反码来讲补码 ?空穴来风,未必无因那是因为计算机就是这样求负数的补码的,我们在键盘上敲一个负数的时候,计算机要把它用补码的形式存储下来,还记得上面我们讲的补码是怎么来的吗?模-绝对值,这是不是个减法公式?但计算机没有减法逻辑,我们费了那么大的劲搞了一套补码的规则就是为了用加法来替代减法,但为了实现这么套规则,却跨不过一个坎,就是把负数计算成补码仍然是需要减法逻辑的。怎么办呢,那些伟大的先贤们 (膜拜)就想出了这么个办法:首位不变,其余位取反后,再加一

参考自:在8位二进制中,-128 没有原码、反码形式,那么它的补码是怎么计算出来的?还是约定的? - Simon Cao的回答 - 知乎

别忘了,object类是所有类的超类,所以,byte中还重写了hashcode,tostring等方法。

再看看下面的例子
在这里插入图片描述
int型是32位的,前面还要补23个0,然后取后八位的结果是00000000
在这里插入图片描述
当a=257的时候,输出就会是1,因为100000001,取后八位。这样理解,其实,是一个新的循环,类似于上面的模的概念。

那么 256+128~256+256之间的数应该也是负数
在这里插入图片描述
思考:400去掉一个256等于144,0~127为正,128~255为负数,144-模256=-112

使用byte时,一定要主要,值得范围 [-128,127]

short

java中short是2个字节,16位,所以,216/2=327682^{16}/2=32768,所以,在这里插入图片描述

Integer

long

boolean

char

double

float

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!