1.给int最大值+1
public class Test1{
public static void main(String[] args){
//保存当前int的最大值,同理也有long maxValue
int maxValue = Integer.MAX_VALUE+1;
int minValue = Integer.MIN_VALUE+1;
System.out.println(maxValue);
System.out.println(minValue);
}
}
给最大值+1或者给最小值-1,我们可以发现数据产生了溢出,因为超过了int的存储范围(2^31-1),如果我们把它换成long型是否就可以了呢?看看结果
public class Test1{
public static void main(String[] args){
//保存当前int的最大值,同理也有long maxValue
long maxValue = Integer.MAX_VALUE+1;
long minValue = Integer.MIN_VALUE+1;
System.out.println(maxValue);
System.out.println(minValue);
}
}
运行发现结果还是溢出了,这是因为我们程序在运行时,是从右向左读的,等号右边的Integer.MAX_VALUE是int类型的变量,1是int类型的常量(Java中所有整型常量默认类型都是int),两个Int类型的数相加,结果自然还是Int类型,我们虽然给maxValue赋为long型,此时已经没有作用。因此我们需要给等号右边的数进行强转转换。代码如下:
public class Test1{
public static void main(String[] args){
long maxValue = Integer.MAX_VALUE+1L; //在整型常量后加上字母L表示常量当前为long类型
long minValue = (long)Integer.MIN_VALUE-1; //将最小值强行类型声明为long型
System.out.println(maxValue); //严格来讲不是强制类型转换 //Java中的强转指的是大类型转为小类型
System.out.println(minValue); //java中的强转指的是大类型转为小类型
}
}
在Java中小的数据类型与大的数据类型做数据运算时,小的数据类型会自动转换为大的数据类型。
eg:10+1L
大的数据类型转换为小的数据类型时必须强转,强转可能会丢失数据。
public class Test1{
public static void main(String[] args){
long maxValue = Integer.MAX_VALUE+1L;
int num = (int)maxValue; //将long强转成int
System.out.println(num);
}
}
2.int与Byte之间的强转
先来看一段代码,看看有没有问题。
public class Test1{
public static void main(String[] args){
byte b1 = 120;
System.out.println(b1);
}
}
等式从右向左,120为整型常量,默认为Int型,而b1是byte型,应该需要强转,看看运行结果。
在Java中,整型常量若在byte类型的保存范围之内(-128~127),可以直接赋值给byte变量,无需强转。若超过范围则会溢出。
若是一个整型变量在byte类型的保存范围内,将其赋值给byte,再看看结果。
public class Test1{
public static void main(String[] args){
int b = 120; //将整型变量赋值给byte
byte b1 = b;
System.out.println(b1);
}
}
若整型常量值超出byte范围必须强转,整型变量无论值是否在byte范围中,都需要强转。其他类型的数值,无论是否在范围内,都需要强转。