小康陪你学JAVA--------溢出的发生

此篇介绍JAVA 中在编写程序的过程中可能出现的一类问题——溢出的发生。

首先来看一下JAVA整数常量的特殊值代码:

01 //  整数值如果超出了自己所可以表示范围的最大值,会出现溢出

02 public class TestJava3_4

03 {

04    public static void main(String args[])

05   {

06     int x = java.lang.Integer.MAX_VALUE ;    //  得到整型的最大值

07

08  System.out.println("x = "+x);

09   System.out.println("x+1 = "+(x+1));

10   System.out.println("x+2 = "+(x+2));

11   }

12 }

输出结果:

x = 2147483647

x+1 = -2147483648

x+2 = -2147483647

当最大值加上 1 时,结果反而变成表示范围中最小的值;当最大值加上 2 时,结果变成表示范围中次小的值,这就是数据类型的溢出。读者可以发现,这个情形会出现一个循环,若是想避免这种情况的发生,在程序中就必须加上数值范围的检查功能,或者使用较大的表示范围的数据类型,如长整型。

当声明了一整数 i,其表示的范围为-2147483648 ~ 2147483647 之间,当 i 的值设为最大值 2147483647,仍在整数的范围内,但是当 x 加1 或加 2 时,整数 x 的值反而变成-2147483648 和-2147483647,成为可表示范围的最小及次小值。

上述的情形就像计数器的内容到最大值时会自动归零一样。而在整数中最小值为-2147483648,所以当整数 x 的值最大时,加上 1 就会变成最小值-2147483648,也就是产生了溢出。可以参考图 3-3 来了解数据类型的溢出问题。

为了避免 int 类型的溢出,可以在该表达式中的任一常量后加上大写的“L”,或

是在变量前面加上 long,作为强制类型的转换。以 TestJava3_5 为例,在下面的程序中

加上防止溢出的处理:

01 //  下面的这段程序当整型发生溢出之后,用强制类型进行转换

02 public class TestJava3_5

03 {

04    public static void main(String args[])

05   {

06      int x = java.lang.Integer.MAX_VALUE ;

06

08   System.out.println("x = "+x);

09      System.out.println("x + 1 = "+(x+1));

10      System.out.println("x + 2 = "+(x+2L));

11      System.out.println("x + 3 = "+((long)x+3));

12   }

13 }

输出结果:

x = 2147483647

x + 1 = -2147483648

x + 2 = 2147483649

x + 3 = 2147483650

小康陪你学JAVA--------溢出的发生

时间: 2024-11-12 18:18:43

小康陪你学JAVA--------溢出的发生的相关文章

小康陪你学JAVA--------运算符及表达式的类型转换

下面列出了各个运算符的优先级的排列,数字越小的表示优先级越高. Java还有一些相当简洁的写法,是将算术运算符和赋值运算符结合成为新的运算符,下面列出了这些运算符. 当int类型遇上了float类型,到底谁是“赢家”呢?在前面曾提到过数据类型的转换,在这里,要再一次详细讨论表达式的类型转换. Java是一个很有弹性的程序设计语言,当上述的情况发生时,只要坚持“以不流失数据为前提”的大原则,即可做不同的类型转换,使不同类型的数据.表达式都能继续存储.依照大原则,当Java发现程序的表达式中有类型不

小康陪你学JAVA--------sort方法对数组进行排序

本篇和大家分享另一种数组的操作的方法——sort方法对数组进行排序. 范例:TestJava4_5.java 01 // 以下程序是数组的排序操作,在这里使用了sort方法对数组进行排序 02 import java.util.*; 03 public class TestJava4_5 04 { 05    public static void main(String[] args) 06  { 07       int a[] = {4,32,45,32,65,32,2} ; 08 09  

小康陪你学JAVA--------数组的介绍

今天小编和大家分享JAVA学习中一个重要的数据类型——数组. 若想要存放一连串相关的数据,使用数组是个相当好用的选择.此外,如果某个程序片段经常反复出现,那么将它定义成一个方法可以有效地简化程序代码.数组是由一组相同类型的变量所组成的数据类型,它们以一个共同的名称表示,数组中的个别元素则以标注来表示其存放的位置. 要使用Java的数组,必须经过两个步骤:(1)声明数组.(2)分配内存给该数组. 这两个步骤的语法如下: 数组的声明格式里,“数据类型”是声明数组元素的数据类型,常见的类型有整型.浮点

小康陪你学JAVA--------continu3和break的比较

本篇将和大家做个continu3和break的比较. 在Java语言中,有一些跳离的语句,如break.continue等语句,站在结构化程序设计的角度上,并不鼓励使用,因为这些跳离语句会增加调试及阅读上的困难.因此建议:除非在某些不得以的情况下之外,否则尽量不要去使用它们.在本篇中,将介绍break及continue语句. break语句 break语句可以强迫程序跳离循环,当程序执行到break语句时,即会离开循环,继续执行循环外的下一个语句,如果break语句出现在嵌套循环中的内层循环,则

小康陪你学JAVA--------JAVA基础总结

此篇是对刚开始接触JAVA的一个小总结. 1.  Java 语言的注释方式有三种: (1).“//”记号开始,至该行结束: (2).“/*”与“*/”这两个符号之间的文字: (3).文档注释. 2. 如果将一个类声明成 public,则它的文件名称必须取成这个类的名称才能顺利编译. 3.  main()在 Java 里是一个相当特殊的 method,它一定要声明成 public,使得在类的其它地方皆可调用到它,且 main() method 没有返回值,所以在它之前要加上 void关键字. 4.

小康陪你学JAVA--------JAVA基本程序设计总结

前段时间对JAVA基本的程序设计做了介绍,小编对此做了一些总结,希望能对大家有所帮助. 1.Java的数据类型可分为下列两种:基本数据类型和引用数据类型. 2.Java提供long.int.short及byte四种整数类型的最大值.最小值的代码.最大值的代码是MAX_VALUE,最小值是MIN_VALUE.如果使用某个类型的最大值或最小值,只要在些代码之前,加上它们所属的类的全名即可. 3.Unicode,它为每个字符制订了一个唯一的数值,如此在任何的语言.平台.程序都可以安心地使用. 4. 

小康陪你学JAVA--------方法简介

方法可以简化程序的结构,也可以节省编写相同程序代码的时间,达到程序模块化的目的.其实读者对方法应该不陌生,在每一个类里出现的main()即是一个方法.使用方法来编写程序代码有相当多的好处,它可简化程序代码.精简重复的程序流程,并把具有特定功能的程序代码独立出来,使程序的维护成本降低. 方法可用如下的语法来定义:  要特别注意的是,如果不需要传递参数到方法中,只要将括号写出,不必填入任何内容.此外,如果方法没有返回值,则return语句可以省略. 方法的参数与返回值 如果方法有返回值,则在声明方法

小康陪你学JAVA--------得到数组中的最大值和最小值的实例

今天和大家分享如何得到数组中的最大值和最小值的实例. 范例:TestJava4_3.java 01 // 这个程序主要是求得数组中的最大值和最小值 02 public class TestJava4_3 03 { 04     public static void main(String args[]) 05  { 06  int i,min,max; 07  int A[]={74,48,30,17,62};    // 声明整数数组A,并赋初值 08 09  min=max=A[0]; 10

小康陪你学JAVA--------数组的拷贝操作

API提供了很多方法供程序开发员使用,接下来两篇将和大家分享两个常用的数组操作方法,今天来介绍第一种方法——数组的拷贝操作. 范例:TestJava4_4.java 01 // 以下这段程序说明数组的拷贝操作 02 public class TestJava4_4 03 { 04  public static void main(String[] args) 05  { 06       int a1[] = {1,2,3,4,5} ;  //声明两个整型数组a1.a2,并进行静态初始化 07