1.Java 的进制表示
(1)十进制: 无需特殊的表示方法,默认数字为十进制
(2)八进制:以0为开头表示八进制
(3)十六进制:以0x为开头表示十六进制
例如:
public class test
{
public static void main(String[] args)
{
int a = 10;
int b = 010;
int c = 0x10;
System.out.printf("a = %d\n", a);
System.out.printf("b = %d\n", b);
System.out.printf("c = %d\n", c);
}
}
其中a、b、c分别为十进制、八进制、十六进制,运行结果如下:
可以看到输出结果不同,且可以得知输出默认为十进制
2.整型间的类型转换
(1)在Java中数字若没有特殊的表示则默认为int类型,而在数字后以L结尾则表示数字为long类型。
例如:
public class test
{
public static void main(String[] args)
{
long a = 100;
System.out.printf("a = %d\n", a);
}
}
在语句 long a = 100;中涉及到了语句的转换
100没有加L修饰表示int类型,而a声明为long类型,将int类型赋值给long类型涉及到了进制转换。
而int是4个字节,long是8个字节,由小容量向大容量可以默认进行类型转换。
运行结果如下:
可以看到正常输出了结果。
但如果我们稍作修改:
public class test
{
public static void main(String[] args)
{
long a = 2147483648;
System.out.printf("a = %d\n", a);
}
}
运行结果如下:
可以看到运行出错了
为什么同样的操作会出现错误呢?
这是因为int类型的范围 为-2^31 到 2^31 - 1
而2147483648比2147483647更大超出了int类型的范围所以导致编译出错
虽然long类型范围足够大,但由于没有添加L后缀,程序还没有运行到赋值这一步就出错了
我们再修改一下:
在数字后添加上L
public class test
{
public static void main(String[] args)
{
long a = 2147483648L;
System.out.printf("a = %d\n", a);
}
}
结果如下:
可以看到运行成功了
值得注意的是小写的l一样可以取得相同的结果
所以,我们应该注意在给long赋值的时候最好在数字之后添加上L后缀,以避免出错。
(2)强制类型转换
当我们试图将一个long类型的值赋值给int类型时
例如:
public class test
{
public static void main(String[] args)
{
int a = 1546L;
System.out.printf("a = %d\n", a);
}
}
结果如下:
可以看到这是不被允许的,一个大容量的数据不允许赋值给一个小容量的变量。
但我们可以通过强制类型转换的方式,进行类型的转换,代码如下:
public class test
{
public static void main(String[] args)
{
int a = (int)1546L;
System.out.printf("a = %d\n", a);
}
}
结果如下:
可以看到通过添加(int)进行强制类型转换,可以帮助我们通过编译,以达到程序可以顺利运行的目的
但是这种方式也会导致一定的问题,如以下代码:
public class test
{
public static void main(String[] args)
{
int a = (int)2147483648L;
System.out.printf("a = %d\n", a);
}
}
结果如下:
可以看到我们输入的明明是2147483648,而得到的居然是-2147483648,输入一个正数居然得到的是一个负数,这样的错误不可能被接受。
而导致这个错误的原因是,当我们把八字节的long类型转换成四字节的int类型时,损失了高位的四个字节的数据。并且由于整型最左侧的一位表示符号位,而2147483648在long中高位的四个字节都为0,低位4个字节都为1,符号位即最高位为0,是正数。而在int中全为1,符号位为1,是负数。
也就是说如果我们的数据本身处于int类型的范围内,强制转换不会导致错误,而在范围之外,会导致较为严重的精度损失。