java整数溢出问题及提升为long型
整数溢出问题
Java 中的 int 用 32 位表示,正数最大值的情况,首位是 0,其他位都可以是 1(就是 2^31-1)。但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且计算机不知道这是溢出情况,把它按照正常的方式输出了,于是就成了负的。
2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2^31 = 2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648
演示1
public class Test {
public static void main(String[] args) {
int num = Integer.MAX_VALUE + 1;
System.out.println(num);
long longnum = Integer.MAX_VALUE + 1; //做加法前没有对加数进行转long型
System.out.println(longnum);
}
}
结果输出的两行都是-2147483648
解释
做加法前,没有将加数转为long型,相加结果为 int 型,Integer.MAX_VALUE + 1 = -2147483648,将 -2147483648赋值给long型变量 longnum 后,longnum = -2147483648,这个很好理解,例如,将 int 型的数 -1赋值给 long 型,结果还是 -1;
演示2
public class Test {
public static void main(String[] args) {
int num = Integer.MAX_VALUE + 1;
System.out.println(num);
long longnum = Integer.MAX_VALUE + (long)1;//将一个加数转为long型
System.out.println(longnum);
}
}
结果输出第一行是 -2147483648,第二行是 2147483648
解释
做加法前,将一个加数转为 long 型,再做加法,由于 long 型可表示的最大数大于 2147483648,没有发生溢出,将该值赋值给 long 型变量longnum,结果为 2147483648
应用
递归求 6 的阶乘
public class Factorial {
public static void main(String[] args) {
System.out.println(fac(6));
}
//使用long作为返回值,递归到最后一次 return 1,返回时,1 被转为 long 型,再依次相乘,结果为 long 型,考虑 int 型溢出
public static long fac(int n){
if(n>1) {
return n * fac(n-1);
}else {
return 1;
}
}
}
java整数溢出问题及提升为long型的更多相关文章
- Java判断整数溢出
开题报告第一版写完发给老师了,熬了两周终于搞出来了,等着被怼了之后再改吧.晚上选了Leetcode一道简单的题,整数反转,就是将一个int类型的数反转.原本确实很简单,最后出现个问题有意思--整数溢出 ...
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...
- java学习二 数据类型自动提升 0x开头的数据是 16进制且是int型
变量只能定义一次,不能定义两次, 变量的作用域:当前的大括号与子括号才有效 变量的作用:存储值,取值 整型:向上自动升级,向下强制降级 char,byte,shot参与运算时候自动提升为int型 因为 ...
- java内存溢出怎么解决
java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemory ...
- [转]Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
原文地址: http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生 ...
- Java基础学习总结(30)——Java 内存溢出问题总结
Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
- java内存溢出分析(二)
我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...
- Java内存溢出详解
转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap ...
随机推荐
- VGG19模型训练+读取
目录 VGG-19模型简单介绍 VGG-19模型文件介绍 分析模型文件 mean值查看 Weight和Bias查看 读取代码 读取模型 训练代码 参考资料 VGG-19的介绍和训练这里不做说明,网上资 ...
- Boost - 从Coroutine2 到Fiber
Boost - 从Coroutine2 到Fiber 协程引子 我开始一直搞不懂协程是什么,网上搜一搜,(尤其是Golang的goroutine)感觉从概念上听起来有点像线程池,尤其是类似Java的E ...
- (6.2)vim文本编辑器
vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大. vim文本编辑器只有命令,没有菜单.
- Spring Boot 初识
发展到今天,spring已经是一个大家族了,如果想要使用其中的两到三个组件就会有多复杂的配置,有时候还有会版本不一致的错误,让人很无奈.于是,就有了spring Boot,spring Boot ...
- 使用Feign调用服务的问题
最近在搞微服务的东西,系统A提供了一个服务,定义方式: @RequestMapping(value = "/hasSuberList", method = RequestMetho ...
- sqlPlus基本操作
SQL*PLUS连接方法 1. $ sqlplus "user/password[@service] [as sysdba]" 2. $ sqlplus /nolog SQL> ...
- 读取tensorflow的checkpoint里保存的参数
import tensorflow as tf from tensorflow.python import pywrap_tensorflow import os checkpoint_path = ...
- mysql 函数获取子节点
DELIMITER $$ USE `topsale`$$ DROP FUNCTION IF EXISTS `getShopIdByUserId`$$ CREATE DEFINER=`root`@`%` ...
- js:苹果手机页面返回,数据不刷新问题
$(function () { var isPageHide = false; window.addEventListener('pageshow', function () { ...
- LevelDB源码分析-Open
Open LevelDB的初始化主要由Open函数实现: Status DB::Open(const Options &options, const std::string &dbna ...