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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hel 中级黑马   /  2013-11-6 12:14  /  955 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class java{
public static void main(String[]args)
{
   byte b = 2;
   
//  b = (byte)(b+3);   //这样可以
  b= b +(byte)(3) ; //为什么这样不可以
   System.out.println(b);
}
}

请大家解释

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

4 个回复

倒序浏览
程序会出错是因为在执行“+”操作前,b +(byte)(3)会从 byte提升至 int,两个 int相加的结果也是 int,然后把一个 int 的值赋值给 b,但是 b 是 byte型的,所以出错。
可以按如下操作进行类型转换:

b= (byte) (b +(byte)(3))

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 FFF 于 2013-11-6 12:27 编辑
  1. b = (byte)(b+3);   //可以
  2. b= b +(byte)(3) ; //不可以
复制代码
是因为 b= b +(byte)(3) 的时候,Jvm不知道你的=号后面的那个b的值。他是变量,编译器编译时并不会知道b具体是多少(编译时不会赋值,所以不知道b是多少),所以JVM会认为b是所有可能的值。所以不能通过。

附:byte题目一道:
  1.          //编译通过。等价于byte = 2;因为右边是常量,其值固定,若在byte型的范围内,编译器会自动完成强制转换;若不在范围内,则编译失败。
  2.     byte b = 1 + 1;
  3.    
  4.     //编译失败。b是变量,编译器编译时并不会知道b具体是多少(编译时不会赋值,所以不知道b是多少),所以会认为b是所有可能的值,
  5.     //因此b+1不能通过编译。正确为: b = (byte) (b + 1);
  6.     //byte b = 1;
  7.     // b= b + 1;
  8.    
  9.     //编译通过。+=是一个赋值运算符,加和赋值是一步完成的,含有强制类型转换。等价于b = b = (byte)(b+1);
  10.     //byte b = 1;
  11.     //b = b += 1;
  12.    
  13.     //编译通过。++是自增运算符,自身加1再赋值给自己,加1和赋值也是一步完成的,且不会改变变量的类型(含有强制类型转换)。   
  14.     //  byte b = 1;
  15.     //  b = ++b;
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
b = (byte)(b+3);这个是因为(byte)类型强制转换所以将其转换成byte类型符合原来b的类型
b=b +(byte)(3) ;这个虽然你在表面上看起来类型都一样,但是虚拟机不确定你得出来的结果一定是byte类型的
回复 使用道具 举报
楼主的问题主要是类型提升没有搞清楚。
首先先清楚一件事:
byte类型的数据在内存是以8个二进制位来表示的

short类型的数据在内存是以16个二进制位来表示的

int类型的数据在内存是以32个二进制位来表示的

但就类型方面可以这样说int>short>byte,当有不同类型的数据通过运算符来进行运算的时如不处理的话是不会直接进行运算的,必须在同类型中进行运算。

自动类型提升原则:以大为主,小的向大的提升
针对楼主问题
b=(byte)(b+3);这样是把b+2的值(b+2的值是int类型的)强制把int类型转换成byte类型后把值赋给b。

而第二种写法b=b+(byte)(3);虽然对int类型的3进行的强制类型转换,但java编译器在编译的时候只检查有没有语法错误,而b=b+(byte)(3)这样写编译器认为是错误的,所以不会通过。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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