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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© joechen 中级黑马   /  2013-11-2 23:25  /  1900 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么这样编译不可以通过
  1. class Demo
  2. {
  3. public static void main(String[] args)
  4. {
  5. byte <span style="line-height: 1.5;">a=1;</span>
复制代码
这样却可以通过
  1. class Demo
  2. {
  3. public static void main(String[] args)
  4. {
  5. int a=1;
  6. a=a+1;
  7. System.out.println(a);
  8. }
  9. }
复制代码
可能是很简单的问题,但是我不知道怎么回事,谢谢了

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

13 个回复

倒序浏览
错了,是把int换成byte就不行了,提示可能会损失精度
回复 使用道具 举报
是会丢失精度的,换成byte时,在运算中自动提升为Int型,a+1为int了,再赋给byte时丢失精度,而byte a =1 赋值中会判断1在byte范围内自动转换

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
看不懂第一段、、、、
回复 使用道具 举报
剑魂 发表于 2013-11-2 23:42
是会丢失精度的,换成byte时,在运算中自动提升为Int型,a+1为int了,再赋给byte时丢失精度,而byte a =1  ...

谢谢啊,是不是a+1,a是byte型,1是int型,然后a+1就成了int型
回复 使用道具 举报
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提升为int类型,会损失精度。前面加上一个强制转换符就可以了

byte a = 1;
a= (byte)a+1;
回复 使用道具 举报
剑魂 中级黑马 2013-11-2 23:56:10
7#
joechen 发表于 2013-11-2 23:53
谢谢啊,是不是a+1,a是byte型,1是int型,然后a+1就成了int型

恩,是的
回复 使用道具 举报
王东 发表于 2013-11-2 23:54
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提 ...

这样可以
                byte a=1;
       
         a=(byte)(a+1);
回复 使用道具 举报
王东 中级黑马 2013-11-3 00:09:41
9#
joechen 发表于 2013-11-3 00:07
这样可以
                byte a=1;
       

恩恩,嘿嘿,忘了打括号了,不好意思美女
回复 使用道具 举报
王东 发表于 2013-11-2 23:54
1是int类型,a是byte类型,如果a+1的话,就是byte类型加上一个int类型,这样的话虚拟机会强行吧byte类型提 ...

byte a = 1;
a = (byte)(a+1);
回复 使用道具 举报


上面的例子中,将数值1赋给byte型变量a,但是由于1是一个int类型的数据,在内存中占4个字节,而byte类型占1个字节,所以做byte a = 1;操作的时候,就是将int型向byte型转换,会出现精度丢失的问题。所以编译会报错。


下面的例子中将数值1赋给int型变量a,然后a = a+1;相当于将a的值加1再赋给a,从始至终都是都是int类型,没有出现类型转换,所以编译是成功的,打印输出a的结果就是2。

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
mayor125 发表于 2013-11-3 00:12
上面的例子中,将数值1赋给byte型变量a,但是由于1是一个int类型的数据,在内存中占4个字节,而byte类型 ...

是不是在int范围内,输入的整数没有标明是byte类型,默认就是int类型的
回复 使用道具 举报
joechen 发表于 2013-11-3 00:23
是不是在int范围内,输入的整数没有标明是byte类型,默认就是int类型的

整型数值默认是int类型的,记得这个就可以了...且转自动类型转换顺序是:byte→short→int→long(按字节大小的顺序是:1→2→4→8),从小到大的顺序转换。如果反过来转换的话,就要用到强制类型转换,但也容易出现精度丢失的情况。
回复 使用道具 举报
王东 发表于 2013-11-3 00:09
恩恩,嘿嘿,忘了打括号了,不好意思美女

我是男的,失望了吧:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马