5-2. 整数类型
【摘要】 Java系列第五课
一、关于java语言当中的整数型:byte、short、int、1ong
1、Java语言当中的“整数型字面值”被默认都当做int类型来处理。要让这个整数型字面值”被当做1ong类型来处理的话,需要在整数型字面值”后面添加1/L,建议使用大写的L。
2、java语言当中的整数类型字面值有三种表示方式
- 第一种方式:十进制【是一种缺省默认的方式,缺省表示前面什么都不写,八进制是0开始,十六进制是0x开始】
- 第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】
- 第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 010;
int c = 0x10;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
结果是:
二、关于整数类型中“类型转换问题”。(很重要的知识点)
不存在类型转换
自动类型转换
强制类型转换
1、不存在类型转换:字面值的数据类型 和 变量的数据类型 一致。
注:Java语言当中的“整数型字面值”被默认都当做int类型来处理。
public class Test {
public static void main(String[] args) {
// 字面值10在Java中默认是int类型,
// 变量a也是int类型的变量
// 将int类型的数据 赋值给 int类型的变量
// 不存在类型转换
int a = 10;
System.out.println(a);
}
}
结果是:
2、自动类型转换:小容量 转换为 大容量。
注:Java语言当中的“整数型字面值”被默认都当做int类型来处理。
public class Test {
public static void main(String[] args) {
// 字面值10在Java中默认是int类型,
// 变量a是long类型的变量
// 将int类型的“小容量”变量 赋值给 long类型的“大容量”变量
// 会发生“自动类型转换”
long a = 10;
System.out.println(a);
}
}
结果是:
问题:假如说给出的值超出了int类型的取值范围,会出现什么情况呢?
public class Test {
public static void main(String[] args) {
// 字面值2147483748在Java中默认是int类型,
// 但是该值超出int取值范围【-2147483648,2147483647】。
// 变量a是long类型的变量
// 这种赋值方法,会出现编译错误。
long a = 2147483648;
System.out.println(a);
}
}
结果是:
解决办法 :在这个过大整数值后面添加一个大写的L,即可。
public class Test {
public static void main(String[] args) {
// 在字面值2147483748后面添加一个L,
// 2147483748L默认会被当作8个字节的long类型
// 变量a属于long类型的变量
// 因此,这种写法“不存在类型转换”。
long a = 2147483748;
System.out.println(a);
}
}
结果是:
记住:在java中写的“整数型字面值”都会被当作int类型来处理。而“字面值+L”类型的字面值,都会被当作8字节的long类型来处理。
3、强制类型转换:大容量 转换为 小容量。
注:Java语言当中的“整数型字面值”被默认都当做int类型来处理。
public class Test {
public static void main(String[] args) {
// 在字面值100后面添加一个L,
// 100L默认会被当作8个字节的long类型数据
// 变量a属于long类型的变量
// long类型数据 赋值给 long类型的变量
// 因此,这种写法“不存在类型转换”。
long a = 100L;
// 将大容量变量a 赋值给 小容量变量b
// 会编译报错。
// 此时需要使用“强制类型转换”
int b = a;
System.out.println(b);
}
}
结果如下:
解决办法 :使用强制类型转换,需要加“强制类型转换符”
public class Test {
public static void main(String[] args) {
long a = 2147483648L;
// 将大容量变量a 赋值给 小容量变量b
// 会编译报错。
// 此时需要使用“强制类型转换”
// 此时编译通过,但是精度会损失很严重。
int b = (int) a;
System.out.println(b);
}
}
结果是:
“强制类型转换”出现的问题:编译可以通过,但是会出现精度损失,这个损失会很严重。(只有long类型数据的字面值,超过int数据类型取值范围的时候,才会出现精度损失)
4、特殊情况:Sun公司对byte、short类型的优待政策
public class Test {
public static void main(String[] args) {
// byte的取值范围:【-128,127】
// 12属于一个int类型的字面值数据,大容量
// a属于一个byte类型的变量,小容量
// 以下写法,属于大容量 转换为 小容量
// 假如不写强制类型转换,会不会编译出错呢?
byte a = 12;
System.out.println(a);
}
}
结果: // 编译通过
再看看下面一个例子:
public class Test {
public static void main(String[] args) {
// byte的取值范围:【-128,127】
// 128属于一个int类型的字面值数据,大容量
// 128超出了byte类型的最大值
// 这样会不会报错呢?
byte a = 128;
System.out.println(a);
}
}
结果是: // 编译出错
解决办法 :仍然是使用强制类型转换,需要加“强制类型转换符”。但是会出现“精度损失”。
public class Test {
public static void main(String[] args) {
// byte的取值范围:【-128,127】
// 128属于一个int类型的字面值数据,大容量
// 128超出了byte类型的最大值
// 这样会不会报错呢?
byte a = (byte) 128;
System.out.println(a);
}
}
结果是:
总结如下:
以上结论,对于int类型转换为short类型,同样适用。
public class Test {
public static void main(String[] args) {
// short的取值范围:【-32768,32767】
// 32767属于int类型的字面值
// b属于short类型的变量
// 此种写法属于大容量 转换为 小容量
// 虽然是强制类型转换,但是不用写“强制类型转换符”
short b = 32767;
System.out.println(b);
}
}
结果是:
当int类型字面值超过short变量值范围,会出现“精度损失”。
public class Test {
public static void main(String[] args) {
short b =(short) 32768;
System.out.println(b);
}
}
结果是:
5、补充一个关于上述知识点的“错误写法”。
// 以下写法会出现编译错误
int a = 100;
short b = a;
System.out.println(b);
// 但是如下写法又是没有问题
short b = 100;
System.out.println(100);
我们试验一下;
public class Test {
public static void main(String[] args) {
int a = 100;
short b = a;
System.out.println(b);
}
}
结果是: // 编译错误
出现上述错误的原因是什么呢?
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)