黑马程序员技术交流社区

标题: s+=5的一些困惑 [打印本页]

作者: 云上    时间: 2013-7-29 17:23
标题: s+=5的一些困惑
本帖最后由 杜光 于 2013-7-30 11:04 编辑

byte s;s+=5 ;s =s +5中的;s+=5 ;s =s +5有什么不同?
  s =s +5是2次运算,里面包含自动类型提升。编译失败
  s+=5 是一次运算。编译成功

s+5 虚拟机中怎么运算的?
byte a =1;
a+=1000;
System.out.print(a);
居然编译通过了,结果-23,这个想不明白了
作者: 手心里的温柔    时间: 2013-7-29 17:32
超出byte的范围了
作者: 潘才新    时间: 2013-7-29 17:53
s=s+5会被强制转换为更高的数据类型,s+=5不会被转换类型,也就是数据类型不变
作者: 罗广伟    时间: 2013-7-29 18:59
编译就是把代码翻译成二进制代码,并不会运算,所以会编译通过。结果是-23是因为;byte a =1;a+=1000;这两句计算完结果为1001,然后会把1001赋给a,1001的二进制代码是1111101001一共10位但是byte只能存8位1001超出了byte的范围,所以就自动把最高位舍去把剩下的八位赋给a。剩下的八位是11101001这个二进制换算成十进制就是-23.
作者: 李江    时间: 2013-7-29 19:28
byte s = 0;
s=s+5;//编译报错,此处s+5s先转成int和5加,结果还是int,赋给s(byte)需要强制转换
byte a=1,b=1;
byte c;
c=a+b;//编译报错,虽然a,b是byte类型,但a+b被提升,是int,int--->byte,不合法,要强制转换

a+=1000;在JVM中的运算过程楼上是对的。

作者: nihaoligong    时间: 2013-7-29 20:38
因为s+=5不会被转换类型,超出byte类型,所以出错。而s=+5 会自动提升到int
作者: 张亚军    时间: 2013-7-29 22:11
byte s;
s+=5 ;//表示的是:s=(byte)(s+5),所以编译成功
s =s +5;//而s+5没有类型转换等号的左边是byte类型,而右边是int,int型的数据无法赋给byte型的数据,所以编译失败
作者: Mr_Free    时间: 2013-7-30 00:25
byte s+=5 ;这句话中s+=5只做了一个赋值运算,内部会做一个自动强转动作,结果存入s中,所以是正确的
byte s =s +5;这里的5默认数据类型是整型(32位二进制数),s是byte型(取值范围-128到127,8位二进制数),在数据类型不同的数据进行计算时,取值范围小的数据类型将自动转换成取值范围大的数据类型。所以右边的s+5运算结果数据类型自动提升为int,由于s是一个变量,他的值不确定,所以虚拟机就会报异常,无法赋值非byte。

byte s=1 转2进制就是s=00000001;
s+=1000; 先看一下int类型的1000转二进制是00000000 00000000 00000011  11101000;因为s是int 被虚拟机强制转byte的话,会截取他8位的数据 就是11101000,
因为最高位是1 作为符号位,所以他是一个负数,在机器中他是以补码形式存在(为什么是以补码形式存在?因为不管负数整数,都可以用补码进行加法运算),然后我现在给他+1,结果就是11101001。这个结果是补码,现在 转成我们能看懂的源码(补码带符号位取反+1)就是10010111;其中10111转10进制就是23 最前面那个1就代表负号,结果是-23


作者: 诸隆隆    时间: 2013-7-30 00:31
别闹,byte一共多大,一口气加个1000上去




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