作为初学者,我想验证下强制类型转换后能否输出的问题,不在乎是否丢失精度哈,写了下面一段代码,为什么一输出就报错呢?
public class QiangZhiZhuanHuan1
{
public static void main(String[] args)
{
int a=12;
byte b=13;
byte c=(byte)a+b;
System.out.println(c);
}
}
改成下面这样才不会出错:
public class QiangZhiZhuanHuan1
{
public static void main(String[] args)
{
int a=12;
byte b=13;
byte c=(byte)(a+b);
System.out.println(c);
}
}
有点不太明白,变量b已经在前面定义为byte类型啦,什么在进行强制转换时候还需要对(a+b)的结果进行转换,我直接对a进行强制类型转换成byte类型,然后再和b相加不行吗?
粘过来的,Java类型转换
(1)boolean类型不参与转换
(2)默认转换
A:从小到大
B:byte,short,char --> int long float double
C:byte,short,char之间是平级的,不相互转换,直接转成int类型参与运算。
(3)强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
A:下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;向下类型转换,浮点数默认是double类型
B:下面的程序有问题吗,如果有,在哪里呢?
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
short s1=3;
short s2=3;
short s3=s1+s2;
char c1=3;
char c2=4;
char c3=c1+c2;
byte、short、char在运算时,会自动向上转型为int型,所以返回的结果是int类型,而返回值的类型均不是int,由于类型不匹配,所以报错
byte b4 = 3 + 4;
short s=3+4;
常量进行计算后的值,预编译时能够判断其是否超出范围
int a=1;
int b=2;
int c=a+b;
long l1=3l;
long l2=3l;
long l3=l1+l2;
float f1=2.3f;
float f2=2.3f;
float f3=f1+f2;
double d1=3.7;
double d2=3.9;
double d3=d1+d2;
均不会报错,因为整数常用,java进行了优化。
byte'char'shot在进行混合运算是会自动提升为int类型,所以你的结果只需要你的第二种方式就行了,第一个类型还需要强制转换!
byte c=(byte)a+b 这句话你的意思应该是先把int类型的a变成byte然后再和byte类型的b相加最后再把结果赋值给byte类型的c
这样会报错的原因是因为c是byte类型的变量值不确定,转换后的a和b相加的结果可能会超出byte所能装下的最大数值
你可以这样想:第一种:a假设强制转化成功,那么两个byte相加可能就是int,也可能是byte ,而你却用byte接收,肯定错误。
第二种:a+b自动提升为int。你强制转换成byte是可以的。所以用byte接收也是可以的。
byte+byte=int 我记得是这样,所以你还得再强制转换一次才行,其实只需要对结果进行转换就好啦!就像你的第二种方式
你可以这样想:第一种:a假设强制转化成功,那么两个byte相加可能就是int,也可能是byte ,而你却用byte接收,肯定错误。
第二种:a+b自动提升为int。你强制转换成byte是可以的。所以用byte接收也是可以的。
byte+byte自动提升为int
非常感谢,各位朋友们的帮助,初学java,后期还希望大家能够多多指教。