黑马程序员技术交流社区

标题: java中的类型转换问题? [打印本页]

作者: Leo_yeung    时间: 2013-9-25 21:39
标题: java中的类型转换问题?
本帖最后由 Leo_yeung 于 2013-10-10 17:29 编辑

byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
关于上面两个表达式怎么理解?
由于在java中,所有的整数默认都是int类型的,可不可以理解为:在运算时,b1,b2都要先转换为int类型,再赋值,所以将int型赋给byte型时报错?

作者: long362144768    时间: 2013-9-25 22:09
主要是精度问题,我运行的时候出现的提示信息是可能损失精度。需要加个强制类型转换,这样编译就没有问题了。byte表示的范围很小(-128~127),一般情况下很少使用数学运算,而是逻辑(| ^ ~)运算。不过拿来研究是可以的。
作者: 放飞自己365    时间: 2013-9-25 23:07
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
在上面的两个表达式,其中b=3+4运算时没有类型转换的,因为常量计算是直接相加;而b=b1+b2 式子运算时,运算的结果是int型,然而把它赋给byte型的b一定是报错的,如果一定想这么做的话可以加上一个类型 强制转换b=(byte)(b1+b2),你在下面理解是对的,但是在java中不加类型时整数默认的类型是int型,小数(实数)默认的是double型
作者: Leo_yeung    时间: 2013-9-25 23:26
放飞自己365 发表于 2013-9-25 23:07
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错

我觉得这样理解还是有点问题的,第一,3和4是常量,默认是int类型的,b是byte类型的,b=3+4;编译时,java应该会检查这个结果是否会超出byte的范围,如果不会,OK,如果是b=3+125可定会报错;
第二,b=b1+b2;三个变量全部被定义为byte类型,java应该不会将b1+b2的结果转换为int型,而是因为b1,b2是变量,所以编译器无法检查b1+b2的结果是否会超出byte的范围,所以报错“可能会损失精度”,另外b=b1+4;也是一样的道理

第三,还有一种特殊的情况是+=,-=,*=,/=,%=在运算时,是不会报错的,即使超出byte的范围也不会报错,可能是java进行了隐式的强制类型转换,这里应该是向下转型,当b+=128时会输出负数,所以丢失精度了。

作者: 小痞痞    时间: 2013-9-25 23:42
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
b = 3 + 4 因为三四都为常量jvm在运算的时候会进行判断是否超过了byte的取值范围、如果没超过byte的取值范围java虚拟机就会直接进行运算然后再赋值给b、如果超出byte的取值范围会报错  错误: 可能损失精度
而b1和b2都属于变量、jvm无法判断变量的的值所以会直接报出损失精度

作者: Leo_yeung    时间: 2013-9-25 23:58
小痞痞 发表于 2013-9-25 23:42
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错

可能因为java中的所有整数默认都是int类型的,所以精度低于int的数据类型都会出现这样的情况,byte,short,char,好像精度比int高的数据类型就不会出现,如long,double
作者: 施大勇    时间: 2013-9-27 14:28

byte b,b1=3,b2=4;
b=3+4;//正确  一步赋值,在底层进行了强转,由JVM完成
b=b1+b2//编译报错     b1和b2都是int,值超出范围,需强转
作者: 王飚    时间: 2013-9-30 20:39
/*
类型转换
*/

class  ClassDemo
{
        public static void main(String[] args)
        {
                byte b,b1=3,b2=4;
                System.out.println(b=(byte)(b1+b2));
        }
}
//这里运算时,b1+b2发生类型提升,所以,将它的结果转回byte就行了;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2