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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

云上

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 云上 初级黑马   /  2013-7-29 17:23  /  1204 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 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,这个想不明白了

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

8 个回复

正序浏览
别闹,byte一共多大,一口气加个1000上去
回复 使用道具 举报
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

回复 使用道具 举报
byte s;
s+=5 ;//表示的是:s=(byte)(s+5),所以编译成功
s =s +5;//而s+5没有类型转换等号的左边是byte类型,而右边是int,int型的数据无法赋给byte型的数据,所以编译失败
回复 使用道具 举报
因为s+=5不会被转换类型,超出byte类型,所以出错。而s=+5 会自动提升到int
回复 使用道具 举报
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中的运算过程楼上是对的。
回复 使用道具 举报
编译就是把代码翻译成二进制代码,并不会运算,所以会编译通过。结果是-23是因为;byte a =1;a+=1000;这两句计算完结果为1001,然后会把1001赋给a,1001的二进制代码是1111101001一共10位但是byte只能存8位1001超出了byte的范围,所以就自动把最高位舍去把剩下的八位赋给a。剩下的八位是11101001这个二进制换算成十进制就是-23.
回复 使用道具 举报
s=s+5会被强制转换为更高的数据类型,s+=5不会被转换类型,也就是数据类型不变
回复 使用道具 举报
超出byte的范围了

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马