java long与int取值范围的问题

1:long l = 1024*1024*1024*4; //0
2:int i1 = 1024*1024*1024*4; //0
3:int i2 = 220000000000; //错误
4:long l1 = 220000000000; //错误
5:long l1 = 220000000000L; //正确
1-4都是超过int(-2^31 — 2^31-1)的范围,为什么1-2不报错且值是0,而3-4却是错的呢?
根据"直接量"不超过范围,可以直接赋值。根据这个原则。
以1-4为例,这个范围是 "直接量"的自身范围(int范围)还是被赋值方的范围(long范围)呢?
求解答,谢谢!
Integer.MAX_VALUE + 1 ,这样不报错,-2147483648
2147483648,这样就直接报错。
long l = 1024*1024*1024*4; 结果是0
long l = 4294967296; 这样就直接报错。
1024*1024*1024*4 = 4294967296,它们是相等的
真的有点蒙了!

首先 不如果不加L在后面标明 默认是int型
所以4是错误的 5是正确的
3明显溢出 不讨论
1与2主要涉及到乘法的问题
java在相乘之前不知道你的结果是否溢出
只有在乘的时候才知道
所以乘完后结果自动转换到长整形
而你又把他赋值给整形变量
所以他自动截取了后面的部分
结果就是0了追问

long l1 = Integer.MAX_VALUE + 1 ,这样不报错,-2147483648
long l2 = 2147483648,这样就直接报错。
这样是不是跟乘法一样道理啊?

追答

是的
他会先向上转型
然后截取部分

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-07
都是对的。1 2不报错因为编译通过,运行时值是0,因为赋值时超出了int类型和long类型的范围,应该是后台自己处理超出范围的数导致的结果。 3 报错是因为编译时就判断错已经超出范围,4错是因为右边的数 java声明一个基本类型时默认是int类型,22000000...超出了int的范围,报错。5加一个L显示声明它是一个long类型的,在long的范围内。所以对的。
第2个回答  2013-11-07
因为默认的整数都是int型的,你1-2都是向上转型,当然没错啦……是0是因为1024*1024*1024*4
是int型的最大值加一的结果,就是-1加1的结果。你可以把1式子改成
long l=1024*1024*1024*4L,运行下就可以看出来了
第3个回答  2013-11-07
你可以说试试这样:
long l = 1024*1024*1024*4 -1;
l=l+1;
第4个回答  2013-11-07
定义的时候类型不会自动向上转换,运行的时候会自动向上转换。
相似回答