Java之数据溢出

首先,我们来讨论一个话题,是否存在一个数,使得这个数加一之后小于这个数呢?表面来看是不可能的。那么接下来,来看下面这个代码:

public class Day1 {
    public static void main(String[] args) {
        int num = Integer.MAX_VALUE;
        int num1 = num + 1;
        System.out.println("num = " + num);
        System.out.println("num1 = " + num1);
    }
}

程序执行结果:

这就是下面要介绍的数据溢出问题。对于int ,  long,  double等基本数据类型,都有自己的保存范围,一旦超过这个界限,则会出现数据溢出问题。我们以127和-128为例,来进行解释:

在计算机中数据的存储都是用补码的编码方式存储的。对一个数的二进制序列它的最高位是符号位。0表示正数,1表示负数。
127的二进制序列:0111 1111
-128的二进制序列 : 1000 0000

也就是说当127加一后,它的后面是-128,最大的正数加下来是最小的负数。

接下来我们来看一个求斐波那契额序列的代码:

public class Test {
    public static void main(String[] args){
        System.out.println(fact(50));
        System.out.println(fact(5));
    }
    public static long fact(int x){
        if(x == 1){
            return 1L;
        }
        return x * fact(x-1);
    }
}

当进行小数据的求斐波那契的时候,int型完全够用。但是当所数值过大时,int就不够用了,所以使用long进行存储,防止数据丢失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值