java int 乘法溢出问题

今天在看框架的工具包时发现了一个细节,

double d=1024d * 1024 * 1024 * 1024;

第一个1024后面为什么要带个d呢?

于是我尝试了一下:

double d = 1024d * 1024 * 1024 * 1024;
double dw = 1024 * 1024 * 1024 * 1024 ;
System.out.println(d);
System.out.println(dw);

结果为:

1.099511627776E12
0

--------------

0?为啥是0?? java的普通数字类型是int,1024是int,4个int的1024相乘(2^40)已经超出了int的表示范围了,2^32,

 

http://bbs.csdn.net/topics/40216116

看了《Java虚拟机说明书》中“Java语言编程概念”中对“基本数据类型的变窄转换”的介绍才算明白了。

    对于

int i = 1000000;
System.out.println(i*i);
-----------------------
-727379968
-----------------------

    的合理解释和过程应该是这样的:
    Java定义了若干使用于表达式的类型提升规则: 

   1) 所有的byte型. short型和char型将被提升到int型(例外: final修饰的short, char变量相加后不会被自动提升。)
   2)如果一个操作数是long形 计算结果就是long型;
   3)如果一个操作数是float型,计算结果就是float型;
   4)如果一个操作数是double型,计算结果就是double型;

   下面用一个十六进制表示的例子阐释这个问题
   

int i3 = 1000000;
System.out.println ((i3*i3));
System.out.println ("溢出:"+Long.toHexString (i3*i3).toUpperCase());
System.out.println ("long*int返回long所以未溢出:"
                     +Long.toHexString ((long)i3*i3).toUpperCase());
System.out.println ("将溢出后的int值转换成long仍然是错误的:"
                     +Long.toHexString ((long)(i3*i3)).toUpperCase());
System.out.println ("输出溢出后的int值:"
                     +Integer.toHexString (i3*i3).toUpperCase());

---------------------------------------------------
-727379968
溢出:FFFFFFFFD4A51000
long*int返回long所以未溢出:E8D4A51000
将溢出后的int值转换成long仍然是错误的:FFFFFFFFD4A51000
输出溢出后的int值:D4A51000
---------------------------------------------------

   截取是非常直观的

原来如此,于是加了d的1024相乘,结果就会以double储存,这样才能得到正确的结果...真意外 啊啊啊.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值