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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© \(^o^)/ 中级黑马   /  2014-5-17 23:57  /  2308 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一种
int a=3;
  int b=5;
  int c=a+b;
  System.out.println(c);
第二种
  byte a1=3;
  byte b1=4;
  byte c1=a1+b1;
  System.out.println(c1);

为什么第一种能编译通过而第二种却编译失败。

评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1 支持一下,加油!

查看全部评分

13 个回复

倒序浏览
本帖最后由 NewDemo 于 2014-5-18 00:08 编辑

Java代码编译字节码后,byte short char boolean等基础类型都转换成int进行计算 c1=a1+b1;   //a1+b1得到了一个int的值所以需要强制转换 c1=(byte)(a1+b1);
回复 使用道具 举报
int 是默认类型,
java编译器认为   int变量=int变量+int变量    是对的,即使超出了精度,也能编译通过,但这时运行结果是不对的
而对于    byte变量=byte变量+byte变量     ,等号右边是变量,编译器不知道结果是不是超出了精度,编译不给通过
编译器很死脑经的,规定了 int 是默认类型,所以不管右边是不是超了精度,只要不是比 int 高,就通过,byte就没有那么好命了~~~
回复 使用道具 举报
第一种
  int a=3;      
  int b=5;     
  int c=a+b;   c 、a+b的值都是int类型
  System.out.println(c);

因为类型相吻合,所以编译成功!
第二种
  byte a1=3;  
  byte b1=4;  
  byte c1=a1+b1;  a1+b1的和是int类型、c1是byte类型
  System.out.println(c1);
因为在JAVA中,整数被默认成int类型的。浮点数被默认成double类型的。
所以按照第二种情况编译,赋值运算符左右两边的类型不一样,所以赋值不了,如果要赋值,需要对数据进行强类型转换。例如:byte c1=(byte)(a1+b1)

评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1

查看全部评分

回复 使用道具 举报
因为byte类型不是默认变量类型,所以byte类型变量运算时要进行强转!你试一下byte c1=(byte)a1+b1;!(毕老爷讲的)
回复 使用道具 举报
NewDemo 发表于 2014-5-18 00:06
Java代码编译字节码后,byte short char boolean等基础类型都转换成int进行计算 c1=a1+b1;   //a1+b1得到了 ...

有一个写错了,boolean 类型不能转换成其他数据类型。Boolean类型不能参与数学运算。 会报:错误: 二元运算符 '+' 的操作数类型错误
回复 使用道具 举报
陈静 初级黑马 2014-5-18 17:44:35
7#
我也来解释一下:
第二个错的原因是:
  byte a1=3;  //java中可以将int型常量赋值给byte short char 类型
  byte b1=4;  
  byte c1=a1+b1; //java 中byte short char 类型参与运算时不会相互转换,运算符两边都先转成int类型再参与运算。所以a1+b1得到int类型,应该强制转换成byte类型。

回复 使用道具 举报
陈静 初级黑马 2014-5-20 11:05:08
8#
彭旭文 发表于 2014-5-18 10:33
第一种
  int a=3;      
  int b=5;     

可以将int型常量赋值给 byte类型,byte a= 3是可以通过的。
回复 使用道具 举报
陈静 发表于 2014-5-20 11:05
可以将int型常量赋值给 byte类型,byte a= 3是可以通过的。

我个人是这样认为的:
当常量不参加运算的时候,如果它不超出各类型的取值范围的话,赋值可以正常运行,程序可编译成功,因为语法没错,所以byte a=3是可以通过的。
当常量参加运算的时候,运算完毕就会判断左右两边类型是否相同才能进行赋值。例如:byte a = 3+3是不能通过编译的。所以焦点落在"赋值"到底属不属于运算范畴?我个人认为赋值是一种特殊的运算...
欢迎交流...:)
回复 使用道具 举报
彭旭文 发表于 2014-5-20 17:56
我个人是这样认为的:
当常量不参加运算的时候,如果它不超出各类型的取值范围的话,赋值可以正常运行,程 ...

我不同意你的第一个观点
float  f = 0.1 编译是会报错的,java赋值的原则是不可以将表数范围的小的类型直接赋值给大的。只管类型,而不管实际的数有没有超过。0.1默认是double型。 但是有个例外就是 byte char short可以直接用int常量赋值,只要不超过他们的表数范围,这使它成为一个考点。
另外,byte = 3+3.我试了下可以编译通过。

其实这些是我以前看马士兵的视频,里面老师是这样讲解的。
其实我觉得没必要太纠结于这些细节,只要记得这些原则就可以了,
考你一下:long l = 3000000000;是对的吗?

评分

参与人数 1黑马币 +6 收起 理由
彭旭文 + 6 解释得很给力,赞一个!给不了技术分,用黑.

查看全部评分

回复 使用道具 举报
用Eclipse一试试他就会告诉你是什么错。
回复 使用道具 举报
a1+b1将自动转换为int型,然后在赋值给c1.这样会损失精度。。。
修改:
byte a1=3;
byte b1=4;
byte c1=(byte)(a1+b1);
System.out.println(c1);
回复 使用道具 举报
本帖最后由 彭旭文 于 2014-5-29 01:26 编辑
陈静 发表于 2014-5-22 16:36
我不同意你的第一个观点
float  f = 0.1 编译是会报错的,java赋值的原则是不可以将表数范围的小的类型直 ...

谢谢提醒,受教了...部分内容在我脑海默认了某种规则,忘记了部分规则的特殊性...:loveliness:
回复 使用道具 举报
本帖最后由 彭旭文 于 2014-5-29 01:30 编辑
陈静 发表于 2014-5-22 16:41
用Eclipse一试试他就会告诉你是什么错。

:L...long l =3000000000会报错的,数值本身就已经超过了Long的取值范围了!我试下编译验证一下...:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马