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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

byte和int类型整数相加的结果会变成int型,如果定义这个结果为byte型,那么编译不会通过,比如:byte b = b+1;有一次我看到下面这个试题:byte b = 1; b = b+=1;这个就编译运行都可以,为什么呢?求大神解答

public class Test3 {
        public static void main(String[] args) {
            
                         byte b = 1; b = b += 1; //(编译运行都ok)

                         //byte b = 1; b = b + 1; 编译不通过

                         System.out.println(b);
        }
      
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

2 个回复

正序浏览
本帖最后由 其LovE斤 于 2014-1-3 20:55 编辑

byte b = 1; b = b += 1; //(编译运行都ok)

byte b = 1; b = b + 1; 编译不通过

byte b = 1; 为什么通过就不说了。
b = b += 1  和  b = b + 1; 是有区别的:

b = b += 1  
b= (b+=1):
因为   b+=1 是一个复合赋值表达式,在其内部有一个自动转换动作。然后再将b=b 是正确的。
=号右边的转换成左边的数据类型,高类型->低类型 自动转化格式
是java中唯一的高类型向低类型自动转换   (b+=1)执行完是一个byte类型

b = b + 1;
b在这里是变量,是byte类型的变量,1是int型的。编译器将b提升为int型的。然后和1相加
(b+1) 但是“=”右边是变量的情况下,变量代表的是一片内存空间,无法判断是否在byte
范围内。int在内存中占4个字节,byte是占1个字节,左边放不下,错误,报的是  数据精度丢失。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
因为 += 和 -= 运用时会进行自动提升,简单的赋值运算是不可以的,是需要强转的。
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.                 {
  5.             
  6.                         //byte b = 1; b = b += 1; //自动强转

  7.                         //System.out.println(b);

  8.                         byte b = 1;
  9.                        
  10.                         b = (byte)(b + 1); //需要强转

  11.                         System.out.println(b);
  12.         }
  13.       
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马