java基本数据类型里的整型它的范围是从负整数到正整数,用来对应我们数学中的整数。以byte来举例分析它的数据范围为什么是-128~127,也就是-2^7~2^7-1.
byte类型占用1个字节,也就是8位,计算机是用的是2进制,左边表示高位,右边表示低位,最高位表示符号位,其余低位才表示数值。
最高位是符号位,用来表明这个数是一个正数还是一个负数。那么也就剩7位来表示数值了. 如果7位全占满的话,能表示多少个数呢,能表示的最大值也就是7个1, 111 1111, 最小是也就是7个0,个数也就是2^7=128个数, 2进制计算7个1能表示的最大值2^6+2^5+2^4+2^3+2^2+2^1+2^0 其实也就是 2^7-1 = 127, 最小值是0. 所以如果符号位为正数的话的取值范围也就是0~127,总共128个数。
那么负数的最小值为什么不是-127呢,而是-128呢,其实这个也很好理解。符号位为负数的时候也可以表示128个数. 从我们数学的角度来说,整数包含正整数、负整数和0. 但是在计算机表示的时候,最高位表示符号位,一个正数对应一个负数的话,有一个值重合了,也就是0。1对应的负值为-1,那么0呢,正0负0都是0,0已经在符号为正数的时候表示过了,符号位为负数的时候不需要从0开始算了,跳过0从-1开始,那负数能表示的最小值就是-128了。
需要提一点的是负数的2进制表示和正数不一样,可以观察下边代码的打印结果发现:
正数的二进制最高位符号位为0,然后其余二进制位正常计算,0表示数字0,1表示数字2;
负数的二进制最高位符号位为1,其余数字全部取反再加1.
public static void main(String[] args) {
//Byte数据类型,最高位位符号位,0表示正数,1表示负数;
//正数最大取值 2^7-1=127,二进制表示为0111 1111
//正数最小值 0,二进制表示为0000 0000
//负数的最大值 -1,除了符号位之外,全部取反再加1 二进制表示为11111 1111
//负数最小值 -128,除了符号位,全部取反再加1,二进制表示为1000 0000
System.out.println("Byte最大值:"+Byte.MAX_VALUE);
System.out.println("Byte最小值:"+Byte.MIN_VALUE);
System.out.println(Math.pow(2,7));
System.out.println("127的二进制表示"+Integer.toBinaryString(127));//高位为0省略了
System.out.println("0的二进制表示"+Integer.toBinaryString(0));//高位为0省略了
System.out.println("1的二进制表示"+Integer.toBinaryString(1));//高位为0省略了
System.out.println("-1的二进制表示"+Integer.toBinaryString(-1));
System.out.println("-128的二进制表示"+Integer.toBinaryString(-128));
System.out.println("-127的二进制表示"+Integer.toBinaryString(-127));
}
打印结果:
Byte最大值:127
Byte最小值:-128
128.0
127的二进制表示1111111
0的二进制表示0
1的二进制表示1
-1的二进制表示11111111111111111111111111111111
-128的二进制表示11111111111111111111111110000000
-127的二进制表示11111111111111111111111110000001