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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© peku 中级黑马   /  2014-4-17 21:50  /  836 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么byte x=1和byte x=1;x+=1以及byte x=1;x++这3种可以自动转换,而byte x=1;x=x+1不可以呢,都弄个自动转换不好吗,干嘛就最后一个不行,存在即合理的话肯定有这样做的道理,求高手解答

10 个回复

倒序浏览
本帖最后由 满兴旺 于 2014-4-17 21:57 编辑

x++,x+=1;应该是在自身身上作变换。而x=x+1;
x+1要先把x转换成int型,因为系统默认int型嘛,也就是后面那个1
然后把结果存入x里面
虚拟机一看,发现x是byte型,而int转换成byte是要损失精度 的。所以要报错。
回复 使用道具 举报
byte x=1;x=x+1这个的意思是X为byte类型,然后byte类型和整形1相加,然后将结果赋值给byte类型的x,自然不行了,会损失精度。byte x=1;x+=1这句话前面的说过了,X+=1的意思是这样:x=(byte)(x+1),另外两种我想你应该是懂得
回复 使用道具 举报
int占4个字节,byte占1个。占的字节数不一样。你把int装到byte里面就等于一缸水倒一个碗里,那怎么行啊!
回复 使用道具 举报
第一个就是赋值,就不说啦~
byte x=1;x+=1
这个在内存中是先有一个内存段x ,然后设立一个内存段 1
然后将两个值相加得到一个值,本题中为2 。而且这个2应该是一个单独的值,还不具备类型。
然后声明byte x = 2 是一个赋值运算。所以可以通过。
byte x=1;x++
这个是直接在内存中把x变大一个。感觉就是00000001变成00000010的样子。也不涉及x类型改变的问题。
byte x=1;x=x+1
这个的运算过程则是先算等号右边的
byte 1+int 1
然后系统自动进行了类型提升。
变成了int 1+int 1,然后得到int 2
这时候这个算式就变成了
byte 1 = int 2,所以就报错啦。
按我自己的个人认识,我觉得这个理解的关键是“值”,有些数据刚刚运算出来和录入时候貌似是游离在8中基本数据类型之外的。但是这些“值“没法单独存在,必须立刻声明一种基本数据类型把它装起来。比如byte,int这些。装之前的值可以直接赋给各种类型变量。装之后就成了一个变量,就受到规则限制了。

评分

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

查看全部评分

回复 使用道具 举报
满兴旺 发表于 2014-4-17 21:54
x++,x+=1;应该是在自身身上作变换。而x=x+1;
x+1要先把x转换成int型,因为系统默认int型嘛,也就是后面那 ...

但是毕老师的视频上说x+=1其实前面过程和x=x+1,就是最后自动将加的结果转换成byte的,所以不会报错,所以我就想知道为什么x=x+1不也搞个自动转换
回复 使用道具 举报
peku 中级黑马 2014-4-17 22:07:02
7#
本帖最后由 peku 于 2014-4-17 22:09 编辑
月光海 发表于 2014-4-17 21:55
byte x=1;x=x+1这个的意思是X为byte类型,然后byte类型和整形1相加,然后将结果赋值给byte类型的x,自然不 ...

这个我明白,我是想知道为什么x=x+1不搞个自动转换,就是这样x=(byte)(x+1),这样不就和x+=1一样了吗,为什么偏偏这个不加自动转换,既然这样设计是不是这样可能会应对某些情况
回复 使用道具 举报
byte x=1      //byte8个字节,最大2^7,所以byte x=1是标准的变量定义;
byte x=1;x+=1        //x+=1相当于    x = (byte)(x+1);强制类型转换
byte x=1;x++          //同第一个,++是自增运算符,不改变变量的类型;
byte x=1;x=x+1      //x是byte类型变量,1是一个int型,相加结果是int型,int型超出了byte定义范围,要损失精度
回复 使用道具 举报
peku 发表于 2014-4-17 22:03
但是毕老师的视频上说x+=1其实前面过程和x=x+1,就是最后自动将加的结果转换成byte的,所以不会报错,所 ...

+=是1个运算符,建议查查底层代码
回复 使用道具 举报
peku 发表于 2014-4-17 22:07
这个我明白,我是想知道为什么x=x+1不搞个自动转换,就是这样x=(byte)(x+1),这样不就和x+=1一样了吗,为什 ...

这个就是损失精度的问题啊,在实际的开发中可能有的程序员不注意这个问题,如果因为程序中精度的损失造成了某些不该发生的问题怎么办,如果在航天这类要求较高的行业因为精度损失造成的问题是很严重的啊
回复 使用道具 举报 1 0
peku 中级黑马 2014-4-18 08:49:46
11#
月光海 发表于 2014-4-17 22:12
这个就是损失精度的问题啊,在实际的开发中可能有的程序员不注意这个问题,如果因为程序中精度的损失造成 ...

额,也就是如果要求比较高的话就用x=x+1,因为要考虑精度问题,如果不怕可能存在的精度损失就用x+=1吧,谢谢了,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马