java long与int取值范围的问题

1:longl=1024*1024*1024*4;//02:inti1=1024*1024*1024*4;//03:inti2=220000000000;//错误4:lo... 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,它们是相等的
真的有点蒙了!
展开
 我来答
人比黄瓜瘦007
2013-11-07 · TA获得超过2851个赞
知道小有建树答主
回答量:1078
采纳率:50%
帮助的人:557万
展开全部
首先 不如果不加L在后面标明 默认是int型
所以4是错误的 5是正确的
3明显溢出 不讨论
1与2主要涉及到乘法的问题
java在相乘之前不知道你的结果是否溢出
只有在乘的时候才知道
所以乘完后结果自动转换到长整形
而你又把他赋值给整形变量
所以他自动截取了后面的部分
结果就是0了
追问
long l1 = Integer.MAX_VALUE + 1 ,这样不报错,-2147483648
long l2 = 2147483648,这样就直接报错。
这样是不是跟乘法一样道理啊?
追答
是的
他会先向上转型
然后截取部分
_绝版温柔
2013-11-07 · TA获得超过125个赞
知道答主
回答量:80
采纳率:100%
帮助的人:26.8万
展开全部
都是对的。1 2不报错因为编译通过,运行时值是0,因为赋值时超出了int类型和long类型的范围,应该是后台自己处理超出范围的数导致的结果。 3 报错是因为编译时就判断错已经超出范围,4错是因为右边的数 java声明一个基本类型时默认是int类型,22000000...超出了int的范围,报错。5加一个L显示声明它是一个long类型的,在long的范围内。所以对的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
壁纸汇集站
2013-11-07 · TA获得超过155个赞
知道小有建树答主
回答量:252
采纳率:0%
帮助的人:63.9万
展开全部
因为默认的整数都是int型的,你1-2都是向上转型,当然没错啦……是0是因为1024*1024*1024*4
是int型的最大值加一的结果,就是-1加1的结果。你可以把1式子改成
long l=1024*1024*1024*4L,运行下就可以看出来了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
glhong23
2013-11-07 · TA获得超过146个赞
知道答主
回答量:104
采纳率:0%
帮助的人:53.5万
展开全部
你可以说试试这样:
long l = 1024*1024*1024*4 -1;
l=l+1;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yinzirunzhl
2013-11-07 · 超过21用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:48万
展开全部
定义的时候类型不会自动向上转换,运行的时候会自动向上转换。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式