Java中整型默认类型

Java中整型默认为 int 类型,存储为4个字节,32位。

Java中后缀加了 “L” 时,为长整型。

1
2
long a1 = -1;   // 默认为int,自动向上转型为 long
long a2 = -1L; // 自动为long 类型
验证默认为 int 类型
1
2
3
4
long a1 = 037777777777;// (1)
long a2 = 037777777777L;// (2)
System.out.println(a1); // -1
System.out.println(a2); // 4294967295

上述代码中,(1)处先转换成 int 的 -1, 再向上转型为 long。所以结果为 -1。

(2)处 long类型为8个字节,64位,直接8进制转换成64位,高位补0,所以最后的结果为正数。

当类型为 short,byte,char时

short, byte, char 计算时,转换成 int 类型计算

1
2
3
4
5
6
7
short a = 1;
short b = 2;
short c = a + b;// 编译报错,a + b的结果为int 类型,需要强制转换

byte a1 = 1;
byte b1 = 2;
byte c1 = a1 + b1;// 编译报错,a1 + b1的结果为 int 类型,需要强制转换

例外情况,使用final 修饰基本数据类型,则基本类型的值不可变,所以运行时不会转换成 int 进行计算。但是用final 修饰包装类,只是引用的地址不可变,还是会转换成int 进行计算。

1
2
3
4
5
6
7
final byte a2 = 1;
final byte b2 = 2;
byte c2 = a2 + b2;// 编译通过,结果为3

final Byte a3 = 1;
final Byte b3 = 2;
byte c3 = a3 + b3;// 编译失败,
16 进制转换,正负数的表示
1
2
3
4
int a1 = 0xff; // (1)处
int a2 = 0xffffffff;// (2)处
System.out.println(a1);// 255
System.out.println(a2);// -1

(1)处转换成二进制,填充到32位,高位不足,直接补0。(2)处转换成二进制,最高为1,所以为负数。

8 进制转换,正负数的表示
1
2
3
4
int b1 = 077;// (1)处
int b2 = 037777777777;// (2)处
System.out.println(b1);// 63
System.out.println(b2);// -1

(1)处,8进制转换成 32 位的 int 时,高位补0。(2)处最高为1,所以为负数。