(前情提要,本文章第一次涉及到的知识作讲解,后面再用不再做详细步骤)
byte
在java的数据类型中我们学到,最小的整数类型是byte,他在计算机中占用1个字节的储存空间.数值表达的范围是-128到127之间.
而现在的问题是,为什么他的数据范围是-128到127之间呢?
这个涉及到计算机的运算规则.计算机是以二进制为法则运算的,在运算中只有0和1来表达数字.
而byte能够存储1个字节的空间,换算到二进制就是8位.也就是说,byte数据类型最多储存8个0或者1.
首先,我们要知道计算机二进制到我们使用的十进制之间的换算.
十进制转换为二进制
简单表达就是"除2取余,逆序排列"
1.首先用2整除一个十进制整数,得到一个商和余数
2.然后再用2去除得到的商,又会得到一个商和余数
3.重复操作,一直到商为小于1时为止
4.然后将得到的所有余数全部排列起来,再将它反过来(逆序排列).
在这里我们用35作一个范例
然后再将余数反过来排列,得到了 100011,这就是35的二进制了
二进制换算为十进制
就需要我们用第n位上的数字(注意:这里数字是从右向左数的),乘以2的(n-1)次方,然后把每一位的数加起来
还是用这个100011来做范例
就是1*2^0+1*2^1+0*2^2+0*2^3+0*2^4+1*2^5
也就是1+2+0+0+0+32=35
现在我们研究的问题就是,8位的二进制他的范围应该是多少了
按理来说,8位的二进制最大值应该是8个1,也就是11111111了,可是我们得到的十进制数字是255,比127大了不少.
符号位
这就涉及到一个符号位的知识.实际上,在计算机的二进制运算中,最前面的一位数字它还用来表达数字的正负值:1表示负数,0表示正数.所以,我们要取到最大值,他的符号位只能是0,不然就成负数了,而这也解释了二进制是如何用来表达负数.
最大值
那么我们再来看到二进制,要想大,第一位只能是0,那后面七位最大的就应该是7个1,也就是01111111了,也就是十进制的127,那么最大值的问题我们就解决了.
最小值
然后我们来看如何取到最小值,要取到最小值,那么首先我们的第一位也就是二进制的符号位,肯定是1了,然后我们来取到7位中绝对值最大的数字,还是7个1.那么我们能得到:符号位是1,就是负的,-127
这个数字的结果和-128也对不上啊,这就涉及到了计算机运算中的另一个知识,补码与反码.
补码与反码
当计算机运算的数字是负数时候,就需要用到反码与补码了(正数就不用考虑了直接计算)
首先反码就是二进制的数字除了符号位不变,其他位的数字全部取反(1变0,0变1)
然后补码就是在反码的基础上给数字+1
了解了这一知识,我们再来看到这8个1
首先符号位是1,负数,进行反码与补码运算:
反码
补码
得到了反码1 0000000之后再+1,得到1 0000001,换算过来也就是-1
这和-128也对不上啊,细心的网友就发现了,既然反码要取反,那么最大值我们就要用最小的来表示了
最小值
首先要是个负数,那第一位符号位就是1,后面取最小的就是7个0.得到10000000
然后将这个数进行反码,符号位不变,其他位取反,得到:11111111
然后进行补码,将1111111加上个1,每一位都进2则添,就由1111111(七位)变成了10000000(八位)
然后将10000000转换为十进制,128,第一位是1,负数.得到了-128
至此,最小值-128和最大值127都已经得到.
byte类型的数据范围问题解决完成.