溢出的问题

计算机在进行运算时,可以表示的数据容量总是有限的,这也决定了一个具体的数据类型描述的数据量是非常有限的,这些数据在进行计算时很有可能超出该数据类型所能表示的范围发生溢出。一个健壮的程序必须正确处理好溢出,因为溢出发生时程序并没有发生崩溃的现象,只是计算结果和预期有很大差异,在复杂系统中存在致命的隐患。本文着重讨论如何正确预防及处理溢出问题。

在32位windows系统中,C语言定义的数据类型如下表:

C语言定义的数据类型
数据类型                  数据长度
char    8bit ( -128 ~ 127 )
short    16bit ( -32768 ~ 23767)
int     32bit (- 2147483648 ~ 2147483647)
long     32bit (- 2147483648 ~ 2147483647)
long long     64bit(-9223372036854775808 ~ 9223372036854775807)
float     32bit(-1.7*10^-308~1.7*10^308)有效数字7位
double     64bit(-1.2*10^-4932~1.2*10^4932) 有效数字16位

对于整数的溢出判断,常见的办法是用一个更大容量的数来存储计算的结果,然后用这个大容量的数与计算因子数据类型的最大值作比较。例如,对于两个有符号型的整数a,b之和,判断是否发生溢出,需要将和与0x7FFFFFFF作比较,即

if(a + b > 0x7FFFFFFF )

{

溢出

}

但是这种做法是错误的,因为对于有符号的整数类型发生溢出时所有关于计算结果的假设均不可靠,需要将计算结果转为long类型或者转换成无符号类型才可靠,即:

if((unsigned int)a + (unsigned int)b > 0x7FFFFFFF)

{

// 溢出

}

时间: 2024-08-11 07:43:33

溢出的问题的相关文章

Tomcat内存溢出解决办法

使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息.JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn -Xms -Xmx等

如何将超级大(肯定溢出)的数用数组来表示

算法原理:以2^10000为例 在最高数组位以2的幂次相乘,当最高位>10,将高位保存在低一位的数组中2^5 在数组中以23形式保存,最后以反向输出 /*在程序中如果要是表示2^1000次方形式,明显肯定溢出,如果用数组形式表示嗯*/ #include<stdlib.h> #include<stdio.h> #define ARRAY_LEN 4000 int main() { int ar[ARRAY_LEN]={0}; int i,j,print_flag=0,jinw;

jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space

使用myeclipse启动部署在tomcat7下的三个项目报出java.lang.OutOfMemoryError: PermGen space 解决办法: 在myeclipse中加大jvm内存方法:Window->Preferences->Myeclipse->Services->Tomcat->Tomcat 6.x->JDK,在Optional Java VM arguments:下边的输入框里输入:-Xms128m -Xmx512m -XX:PermSize=12

Reverse Integer - 反转一个int,溢出时返回0

Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 若反转的数溢出,直接返回0 可以用计算结果来判断溢出,也可以用因数来判断 Java代码实现: 1 public class ReverseInteger { 2 public static int reverseInt(int x){ 3 if (x == 0) { 4 return

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

记一次java程序内存溢出问题

一个自然语言处理程序,在封装为web-service后,部署到线上运行. 但最近出现了内存溢出的情况,频繁的out of memory. 先盲目尝试在启动脚本中增加-XX:-UseGCOverheadLimit. 因为根据原因未找到,依然频繁的out of memory,只能一直观察jstat -gcutil <pid>,看到老生代内存降不下来时,重启程序. 服务程序很简单,简单接收参数,自然语言处理,返回数据,除了自然语言处理模块,都是方法参数,不会出现内存泄漏的情况. 第一次解决这种内存溢

java堆溢出

在Eclipse 配置运行参数或者在命令行中加上参数 eclipse 安装MAT插件,使用. 虚拟机栈内存溢出: 创建很多线程导致内存溢出,可以减少最大堆和减少栈容量. 方法区和运行时常量池溢出 在jdk1.6中intern()方法会把首次遇到的字符串实例复制到永久代.而由StringBuilder创建的字符串实例在java堆上,所以不是同一个引用.而JDK1.7的实现知识在常量池中记录首次出现的引用."java"这个字符串在执行之前就已经出现过了. 方法区溢出 大量产生java类的应

Webloginc 内存溢出解决方法

  Webloginc 内存溢出解决方法  : javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space 解决方法: 1.在base_domain 域下找到startWebLogic.bat 文件,然后打开编辑, 2.然后加入以下的代码 JAVA_OPTS='-Xms512m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=25

深入理解java虚拟机学习 笔记 第二章 java 内存区域和内存溢出异常

2.2 运行时区域 java虚拟机划分成若干个不同的数据区域, 1.程序计数器,字节码解释器工作时就是通过改变计数器的值来取吓一跳需要执行的字节码命令 了解 String.intern()方法 作用: 如果字符串常量池中一个包含了一个等于此String对象的字符串,则返回代表池中的这个字符串的String对象,否则将此对象包含的字符串添加到常量池中,并返回此String对象的引用. 实战 将堆的最小值 -Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展  通过参数 -XX:+HeapD

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环或循环产生过多重复的对象实体: 使用的