A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yapo 中级黑马   /  2015-4-24 22:22  /  3014 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
大家可不可以说以下类型转换的详细原则是什么,在哪些情况下会发生类型转换?

最佳答案

查看完整内容

因为进行+运算或者-运算的时候,如果两边的数据类型比int类型的范围小的话,会自动提升类型到int 然后再进行运算,所以运算后的结果也是int类型,int类型赋值给byte类型就会损失精度,编译会报错。 所以即使你这样写,还是会报错的:byte c=(byte)a+(byte)b; 要这样写才会不报错:byte c=(byte)(a+b);

8 个回复

倒序浏览
yapo 发表于 2015-4-24 22:48
public static void main(String[] args){
byte a=10;
byte b=9;

因为进行+运算或者-运算的时候,如果两边的数据类型比int类型的范围小的话,会自动提升类型到int 然后再进行运算,所以运算后的结果也是int类型,int类型赋值给byte类型就会损失精度,编译会报错。   所以即使你这样写,还是会报错的:byte c=(byte)a+(byte)b;  要这样写才会不报错:byte c=(byte)(a+b);
回复 使用道具 举报
类型转换有隐式转换跟显示转换【强制转换】
    隐式转换:类型范围小的会自动转换为类型范围大的 例如:int a=4; double b=a;
              隐式转换的顺序 byte->short->(char) int ->long ->float ->double
              【long是8个字节,float是4个字节,为什么long可以向float隐式转换呢,是因为内存中存放小数的机制不一样,但是float包含long的所有数据】
   显示转换:当编译的时候出现 可能损失精度错误编译 的时候,应该就是缺乏强制转换的原因
             当类型范围大的数据类型要赋值给类型范围小的数据类型时候,就需要强制转换
             例如 :byte a=1;byte b=2; byte c=(byte)(a+b);        
             【当变量进行+运算的时候,会自动提升类型至int类型,所以a+b就变成了2个int类型的相加,所得的数据也是int类型,当byte=int 会发生 可能损失精度的编译 所以要强制              转换】
回复 使用道具 举报
依秋无泪 发表于 2015-4-24 22:41
类型转换有隐式转换跟显示转换【强制转换】
    隐式转换:类型范围小的会自动转换为类型范围大的 例如:in ...

public static void main(String[] args){
byte a=10;
byte b=9;
byte c=a+b;
System.out.println(c)
}
这种情况下系统会报错,老师说进行a+b的运算时会进行自动类型提升至int型,但是a和b本来就同是byte型啊,
回复 使用道具 举报
本帖最后由 guoyuan 于 2015-4-27 21:56 编辑
yapo 发表于 2015-4-24 22:48
public static void main(String[] args){
byte a=10;
byte b=9;

因为byte , char,short 在进行运算时,会自动提升为int类型。+= ;-=;*=;/=;%= 会自动进行转换。
例:byte a =10;
       a+=10;//不报错
       a=a+10;/报错

另:boolean不能参与转换

回复 使用道具 举报
这样啊,看来好多小技巧
回复 使用道具 举报
             byte b1=3,b2=4,b;
                b=b1+b2;
                b=3+4;
                哪句是编译失败的呢?为什么呢?(short也是同理)
                b = b1 + b2;是有问题的。
                因为变量相加,会首先看类型问题(byte short char 类型时会默认转化int类型),最终把结果赋值的也会考虑类型问题。
                常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。
          还有一个常见就是 short s=2;s=s+1;s+=1; 两句话的区别就是 s=s+1 肯定是编译出错。要s=(short)(s+1);而s+=1;等价于  s=(short)(s+1);
           
回复 使用道具 举报
一个是隐式类型转换   一个是强制类型转换   比如sum+=i  这个里面就有一个隐式类型转换  再就是强制类型转换byte a = (byte)1+2;
回复 使用道具 举报
对于引用类型“子类就是父类”的原则转换
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马