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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
今天无意中发现一个问题,
  1. Long a = 1024*1024*1024*4;
  2. long b = 1024*1024*1024*4;
复制代码

以上第一行代码编译时会报错,输出第二行b的值是0,有些不理解,JDK1.5之后不是可以自动装箱吗?第一行代码的a为什么不可以自动装箱成Long?我用的JDK是1.8版本的。还有b的值为什么是0?long型长度不是8个字节吗?
      在网上查过了,int和long所占用的字节数是和编译器的位数相关的(有的也说是操作系统的位数,我用的操作系统是64位的),如果是和编译器的字长相关,那又如何知道编译器的字长?int和long的关系究竟是怎样的?求大神解答,感激不尽。

最佳答案

查看完整内容

都没加l,默认是存成int型 1,第一行 int 无法向上转换为 Long类型,与装箱没有关系 2,int型最大值是2^31-1,而你输入的是2^32,所以只取了左边的31位(全是零),然后java虚拟机在运行时,默认将int转成long,所以还是零。如果在后面加l就正常了。

5 个回复

正序浏览
路过!!!!!!
回复 使用道具 举报
longlostfriend 发表于 2015-10-24 16:59
都没加l,默认是存成int型
1,第一行 int 无法向上转换为 Long类型,与装箱没有关系
2,int型最大值是2^31- ...

这也行?你不看楼上都被你气炸了
回复 使用道具 举报
{:3_59:}{:3_59:}....路过
回复 使用道具 举报
本帖最后由 rookiefly 于 2015-10-24 18:21 编辑

第一行出错是因为 int 无法向上转换为 Long类型,与装箱没有关系,可以在任意数后边加一个l  eg:Long a = 1024*1024*1024*4l;  这时候会将int转为long装箱为Long   第二行值为0是因为超出了最大值范围,可以通过System.out.println(Long.MAX_VALUE);查看本机的long的最大值。另外,可以通过System.out.println(Long.SIZE)查看long值的位数。
回复 使用道具 举报
都没加l,默认是存成int型
1,第一行 int 无法向上转换为 Long类型,与装箱没有关系
2,int型最大值是2^31-1,而你输入的是2^32,所以只取了左边的31位(全是零),然后java虚拟机在运行时,默认将int转成long,所以还是零。如果在后面加l就正常了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马