java int 乘法溢出问题
2017-12-16 11:46
711 查看
今天在看框架的工具包时发现了一个细节,
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型;
下面用一个十六进制表示的例子阐释这个问题
---------------------------------------------------
-727379968
溢出:FFFFFFFFD4A51000
long*int返回long所以未溢出:E8D4A51000
将溢出后的int值转换成long仍然是错误的:FFFFFFFFD4A51000
输出溢出后的int值:D4A51000
---------------------------------------------------
截取是非常直观的
原来如此,于是加了d的1024相乘,结果就会以double储存,这样才能得到正确的结果...真意外 啊啊啊.
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储存,这样才能得到正确的结果...真意外 啊啊啊.
相关文章推荐
- java int 乘法溢出问题
- java int 乘法溢出问题
- C 语言 int 型乘法溢出问题
- javarscript的加法、乘法、除法不准确的问题
- iBaits中,关于insert返回值的问题(注意!!!不必写resultClass= "java.lang.Integer",方法的返回值就是int)
- JAVA程序内存溢出问题的分析
- java用Socket实现的远程桌面浏览 内存溢出问题
- 数列:1,1,2,3,5,8,13,21,34,..... 求第50个数值? 并用c#写出算法?(不难,但要注意int 溢出问题)
- JAVA中的indexOf(int ch)方法的问题
- INT_MIN和INT_MAX溢出问题
- Java时间处理和int字符串补0问题
- 关于eclipse虚拟内存溢出问题(Failed to create the java Virtual Machine)
- 关于java 内存溢出问题
- SSH整合遇难到的非堆内存溢出问题java.lang.OutOfMemoryError: PermGen space
- java 程序内存溢出问题查找
- JAVA string int Integer间的转换以及日期问题
- 深入JVM(3):由一个栈溢出的问题看Java类和对象的初始化续
- 解决Java中int不能为空而Oracle数据库中Number可以的问题
- java基础问题----Integer与int的区别
- java大图片内存溢出问题解决办法