关闭

Java基本数据类型自动转型溢出问题

1745人阅读 评论(0) 收藏 举报
分类:
<span style="font-size:14px;">public class TestCast {
	public static void main(String[] args) {
		int money=1000000000;	//10亿
		int year=20;
		int total=money*year;
		System.out.println(total);
	}
}</span>

输出结果:-1474836480

这个时候我们就可以想到int的范围是-21亿~21亿而money*year的结果明显超出这个范围所以会溢出,然而将total的数据类型改成long会怎么样呢?

public class TestCast {
	public static void main(String[] args) {
		int money=1000000000;	//10亿
		int year=20;
		long total=money*year;
		System.out.println(total);
	}
}
输出结果:-1474836480

理论上讲应该就会输出正确结果,可实际情况还是溢出。这是为什么呢?因为money和year都是int型,所以他俩的乘积也是int型,超出int型就会出现溢出,可以怎么解决呢?把money或者year强制转换成long型即可,如下:

<span style="font-size:14px;">int money=1000000000;	//10亿
int year=20;
long total=(long)money*year;
System.out.println(total);</span>
输出结果:20000000000
这样就输出了正确结果。但如果写成long total=(long)(money*year);的话,结果依然不正确,因为money与year的乘积已经溢出再强制转换成long类型,结果依然不正确。


再看下面一个小例子:

public class TestCast {

	public static void main(String[] args) {
	/*
		int money=1000000000;	//10亿
		int year=20;
		long total=money*year;
		System.out.println(total);
	*/
	/*
		int money=1000000000;	//10亿
		int year=20;
		long total=(long)money*year;
		System.out.println(total);
	*/	
		//一个人70年心跳多少次
		long times=70*60*24*365*60;
		System.out.println(times);
	}
}
输出结果:-2087447296

很明显溢出,应该如何处理呢?在这条语句long times=70*60*24*365*60;的任一数字后面加上L,强制转换成long类型即可。如long times=70*60*24*365*60L;小技巧,在第一个数字后面加L,这样的话防止前面的相乘结果已溢出如:long times=70L*60*24*365*60;


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

总结

之前A题的时候经常遇到这种大数问题,有时候能搞正确有时候就需要调试几次才能正确,现在已经彻底搞明白大数的强制转换溢出的问题,希望能帮到不明白的朋友。


6
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java long转换为int 类型 注意事项

public static int subDateFmtStr(String start, String end) { if (start == null || end == null) { ...
  • ying890
  • ying890
  • 2015-12-22 16:24
  • 4769

java中long类型转换为int类型

由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一、强制类型转换 [...
  • wt461290528
  • wt461290528
  • 2017-02-15 10:38
  • 5858

java之数据溢出

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马   java是一门相对安全的语言,那么数据溢...
  • pony_maggie
  • pony_maggie
  • 2015-02-22 16:13
  • 6052

Java 基本类型 long 的一些使用陷阱

在java 中byte 占用一个字节,shot 占用两个字节,char 使用的是unicode编码,占用两个字节,int 占用四个字节,long 占用八个字节 在使用long 的时候,有个地方一定要...
  • Will_Lee_Buaa
  • Will_Lee_Buaa
  • 2015-10-08 02:01
  • 6225

Java中的自动转型

什么情况下能够自动转型?1、必须存在继承关系之后才能自动转型 2、子类对象向父类类型自动转型自动转型的格式1、格式一 :父类类型 对象名=new 子类构造方法(参数...
  • wstz_5461
  • wstz_5461
  • 2017-08-21 15:00
  • 155

Java转型(向上或向下转型)

在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。5.13.1 向上转型我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说...
  • shanghui815
  • shanghui815
  • 2010-12-21 10:30
  • 65836

java学习笔记(二)--数据的溢出

数据的溢出: 当整数的数据大小超出了可以表示的范围,而程序中又没有做数值范围的检查时, 这个整型变量所输出的值将发生紊乱,且不是预期的运行结果。 01 //  整数值如果超出了自己所可以表示范围...
  • qingtingchen1987
  • qingtingchen1987
  • 2011-10-30 16:38
  • 2941

java 字符串转化为整数溢出问题处理

1、思路及注意事项 参考:http://blog.sina.com.cn/s/blog_514c89a90100d7qh.html 概括起来有几种情况 1)字符串开头是“+”号或...
  • Evan123mg
  • Evan123mg
  • 2015-05-03 16:54
  • 2153

java long转换为int 类型 注意事项

public static int subDateFmtStr(String start, String end) { if (start == null || end == null) { ...
  • ying890
  • ying890
  • 2015-12-22 16:24
  • 4769

C语言的整型溢出问题 int、long、long long取值范围 最大最小值

溢出和取值范围 C语言的整型溢出问题 整数溢出 int、long int 、long long int 占用字节疑问 《C和指针》中写过:long与int:标准只规定long不小于int的长度...
  • qq_16234613
  • qq_16234613
  • 2017-08-24 20:48
  • 715
    个人资料
    • 访问:260976次
    • 积分:5857
    • 等级:
    • 排名:第5113名
    • 原创:351篇
    • 转载:36篇
    • 译文:0篇
    • 评论:23条
    文章分类