黑马程序员技术交流社区

标题: 数据类型赋值问题 [打印本页]

作者: \(^o^)/    时间: 2014-5-17 23:57
标题: 数据类型赋值问题
第一种
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);

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

作者: NewDemo    时间: 2014-5-18 00:06
本帖最后由 NewDemo 于 2014-5-18 00:08 编辑

Java代码编译字节码后,byte short char boolean等基础类型都转换成int进行计算 c1=a1+b1;   //a1+b1得到了一个int的值所以需要强制转换 c1=(byte)(a1+b1);
作者: 帅哥哥    时间: 2014-5-18 01:39
int 是默认类型,
java编译器认为   int变量=int变量+int变量    是对的,即使超出了精度,也能编译通过,但这时运行结果是不对的
而对于    byte变量=byte变量+byte变量     ,等号右边是变量,编译器不知道结果是不是超出了精度,编译不给通过
编译器很死脑经的,规定了 int 是默认类型,所以不管右边是不是超了精度,只要不是比 int 高,就通过,byte就没有那么好命了~~~

作者: 彭旭文    时间: 2014-5-18 10:33
第一种
  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)


作者: 杨韬略    时间: 2014-5-18 16:10
因为byte类型不是默认变量类型,所以byte类型变量运算时要进行强转!你试一下byte c1=(byte)a1+b1;!(毕老爷讲的)
作者: 陈静    时间: 2014-5-18 17:39
NewDemo 发表于 2014-5-18 00:06
Java代码编译字节码后,byte short char boolean等基础类型都转换成int进行计算 c1=a1+b1;   //a1+b1得到了 ...

有一个写错了,boolean 类型不能转换成其他数据类型。Boolean类型不能参与数学运算。 会报:错误: 二元运算符 '+' 的操作数类型错误
作者: 陈静    时间: 2014-5-18 17:44
我也来解释一下:
第二个错的原因是:
  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
彭旭文 发表于 2014-5-18 10:33
第一种
  int a=3;      
  int b=5;     

可以将int型常量赋值给 byte类型,byte a= 3是可以通过的。
作者: 彭旭文    时间: 2014-5-20 17:56
陈静 发表于 2014-5-20 11:05
可以将int型常量赋值给 byte类型,byte a= 3是可以通过的。

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

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

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

作者: 陈静    时间: 2014-5-22 16:41
用Eclipse一试试他就会告诉你是什么错。
作者: 唤月    时间: 2014-5-24 19:07
a1+b1将自动转换为int型,然后在赋值给c1.这样会损失精度。。。
修改:
byte a1=3;
byte b1=4;
byte c1=(byte)(a1+b1);
System.out.println(c1);

作者: 彭旭文    时间: 2014-5-29 01:23
本帖最后由 彭旭文 于 2014-5-29 01:26 编辑
陈静 发表于 2014-5-22 16:36
我不同意你的第一个观点
float  f = 0.1 编译是会报错的,java赋值的原则是不可以将表数范围的小的类型直 ...

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

:L...long l =3000000000会报错的,数值本身就已经超过了Long的取值范围了!我试下编译验证一下...:lol




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