Java中的整数有四个不同的表示范围类型:其分别是
byte (1个字节)
short (2个字节)
int (4个字节)
long (8个字节)
Java中,一个整型字面量(Integer Literals)其默认的类型是int类型的,还存在另外一个整数字面值常量,它是long类型的。
例如:数字1在内存中存储时,Java编译器认为这个值是一个int类型而将其存储在常量池中,而1L则会以64个位来存储。
(1)当一个整数字面值其范围在byte或者short范围内的时候,将该值赋值给byte或者short变量的时候,Java编译器可以自动地将使用byte或者short类型的变量来存储该字面量的值。
1 /* 2 * 1.对于一个int类型的字面量(其范围在byte或者short可以存储的范围内)在 赋值给byte或者short类型的时候, 3 * Java编译器可以自动将数据使用byte类型或者short类型来进行处理。 4 */ 5 byte b1 = 100; 6 short s1 = 200; 7 //编译器可以识别到这个值的范围大于了byte类型的存储范围时,那么编译会出错 8 b1 = 128; 9 10 /* 11 * 2.当将一个整型字面值赋值给long类型的变量,字面值依旧是int类型, 12 * 但是编译器会使用64个位的long类型变量来存储该字面值。 13 */ 14 long x = 129; 15 System.out.println(x); 16 17 /* 18 * 虽然字i面值在long类型的存储范围之内,但是99999999999已经超过了int类型的最大存储范围,不要忘了,字面值永远是拿着4个位来存储。 19 * 所以需要注意:使用的整型字面值不能超过int的存储范围,下面代码编译失败 20 */ 21 x = 99999999999;
那么如何存储一个大于2147483647(int类型最大存储范围)?
使用long类型的字面值。
1 //告诉编译器这是一个long类型的字面值 2 x = 99999999999L; 3 4 //小细节:只能使用整型字面值赋值,下面代码编译出错 5 //一个小细节:Java只能使用整型字面值赋值给short或者byte,不能使用long类型字面值赋值给byte或者short。 6 b1 = 1L;
(2)整型字面值的4种表示方式:
1 /*3.整型字面值的表示形式 2 * 十进制 3 * 八进制 4 * 十六进制 5 * 二进制 6 */ 7 //十进制赋值 8 int i1 = 26; 9 //八进制赋值,以0开头 10 int i2 = 032; //3*8 + 2 = 26 11 //十六进制赋值,以0x开头 12 int i3 = 0x1a; 13 //二进制赋值,以0b开头 14 int i4 = 0b00011010; 15 16 //在使用八进制赋值的时候,不能出现大于8的数,下面代码编译出错 17 int i5= 098; 18 19 //long类型字面值也可以使用这4中进制来表示 20 long l1 = 25L; 21 long l2 = 026L; //22 22 long l3 = 0X16L; 23 long l4 = 0B10110L;
(3)整数在内存中的存储,都是以其补码的形式进行存储。如果一个数是正数,那么这个数的补码就是这个数的原码。如果一个数是负数,那么它的补码就是其绝对值的原码全部取反+1。
int a = Integer.MAX_VALUE; a = a + 1; //此时造成了数据溢出的问题,原因在于得到的结果是1后面跟着31个0. //通过二进制一推就可以知道该二进制就是-2147483648 System.out.println(a);