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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

fanmeiQ

初级黑马

  • 黑马币:20

  • 帖子:10

  • 精华:0

© fanmeiQ 初级黑马   /  2016-1-16 19:30  /  841 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对变量编译出错不是很理解;如:byte b1=3,b2=4,b;
       b=b1+b2;
       编译时出错是因为
       1.byte类型在进行运算时会自动提升为int类型;2.jvm无法判断变量值大小。
       但是
       int b1=3,b2=4,b;
       b=b1+b2;
       就不会出错。按我的理解就是
       1.int与int类型在进行运算时会不会自动提升为long,如果会,那么编译也应该出错,如果不会,那这一条便没有问题,也就是说自动提升数据类的导致编译出错只会出现在byte、short、char类型时,而对于int、long等数据类型只要不是把大的数据类型的值赋给小的数据类型,便不会出错。
       2.在编译时jvm无法得到变量b1,b2的值,所以不知道这个值赋给同样数据类型的b会不会溢出,所以才会报错,但是byte类型会报错,但是int类型不报错,这是为什么?
       初学java有一些总结和困惑,希望与各位一起讨论学习,增长自己的认识深度,提高学习兴趣,顺便赚点技术分,嘿嘿,第一次发帖,如果哪里出现了什么漏洞或者写的不好的地方,希望各位大神清点喷,谢谢~~~~~~

3 个回复

倒序浏览
你的解释都很正确。为什么 int 类型的不报错,是因为整数的默认类型就是int类型,所以即使两个int类型的变量相加也不会报错,如果超出了int范围,系统会默认舍弃高位,只保留4个字节的有效数据。  
回复 使用道具 举报
黑色皮肤的马 发表于 2016-1-16 19:54
你的解释都很正确。为什么 int 类型的不报错,是因为整数的默认类型就是int类型,所以即使两个int类型的变 ...

谢谢您的解答,但是我还有点困惑,希望能一起探讨下,
以下是老师在上课时讲到的一个例子
“A:案例演示
        * 面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
        * byte b1 = 3;
        * byte b2 = 4;
        * byte b3 = b1 + b2;
                * 从两方面去回答这个题
                * b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值
                * byte类型的变量在进行运算的时候,会自动类型提升为int类型 ”
关于“b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值”貌似并不能解释  byte类型会报错,但是int类型不报错  这个现象,如果以这种思路理解的话,int类型变量的值也是在变化的,jvm也是无法判断具体的值,这时理应报错才是。
       也不知道问题是不是有点钻牛角尖,但是就怕自己理解的是是而非,以后出现问题{:2_32:}
回复 使用道具 举报
fanmeiQ 发表于 2016-1-17 00:08
谢谢您的解答,但是我还有点困惑,希望能一起探讨下,
以下是老师在上课时讲到的一个例子
“A:案例演示

你理解的完全正确。那么我再详细的说一下我的理解。
byte b1 = 3;
byte b2 = 4;
byte b = b1 + b2;这行代码是要报错的。因为b1和b2是两个变量,JVM无法判断两个变量的值,更无法判断两个变量相加后是否超出byte范围,所以会报错。
byte b = 3 + 4;这句代码是不会报错的。因为Java有常量优化机制,意思就是说,这句代码在编译的时候,其实编译器已经把结果算出来是7了,然后判断,7是在byte的范围内的,所以直接把7赋值给了b,所以不会报错。
byte b = 127 + 1;这句代码是会报错的,理由一样,编译的时候先算出结果是128,超出了byte的范围,不能再赋给b了,所以报错。
int a = 3;
int b = 4;
int c = a + b;这句代码是不会报错的。因为int是系统默认的整数类型,即所有整数类型,如果没有指定是长整型,那就是默认int类型。虽然两个int类型的变量相加,算完之后一定还是int类型,如果超出int的范围,系统会把低32位有效数据保留,高于32的数据全部舍弃,因为系统认为这个结果就是一个int类型的数据。
其实说白了,int类型的随便算,系统是不会管你算出来结果有没有错的,虽然两个int之和超出int范围后不会报错,但是算出的结果是与我们想象的不一样的,你可以试一下。
byte就不一样了,它不是系统默认的整数类型,其实内存中是有byte常量池的,也就是-128~127之间的数其实是在一个常量池中存着的,就像上面的byte b = 3 + 4;系统会先算出了结果是7,然后发现常量池中有7这个数据,就不报错,直接赋值了。但是两个变量byte 相加是无法计算值是否在常量池中的,所以报错。
写的有点啰嗦,希望继续探讨。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马