在写代码的时候,尤其是数字计算的时候,我们会经常碰到计算边界的问题,也就是说溢出的问题,比如说:最小的负数-1会出现什么情况?最大的正整数+1会出现什么情况?
先看看下面的代码
package com.test;
public class Test {
public static void main(String[] args) {
Test test = new Test();
Operator op = test.getMaxInstance();
test.printResult("MaxValue", op);
op = test.getMinInstance();
test.printResult("MiniValue", op);
}
public void printResult(String tag, Operator op) {
System.out.println(tag + ": " + op.getValue());
System.out.println(tag + "+1: " + op.add(1));
System.out.println(tag + "-1: " + op.minues(1));
}
public Operator getMaxInstance() {
return new MaxValue();
}
public Operator getMinInstance() {
return new MinimalValue();
}
interface Operator {
int add(int a);
int minues(int b);
int getValue();
}
class MaxValue implements Operator {
final int value = 0x7fffffff;
@Override
public int getValue() {
return value;
}
@Override
public int add(int a) {
return value + a;
}
@Override
public int minues(int a) {
return value - a;
}
}
class MinimalValue implements Operator {
final int value = 0x80000000;
@Override
public int add(int a) {
return value + a;
}
@Override
public int minues(int b) {
return value - b;
}
@Override
public int getValue() {
return value;
}
}
}
运行上面的代码结果是:
MaxValue: 2147483647
MaxValue+1: -2147483648
MaxValue-1: 2147483646
MiniValue: -2147483648
MiniValue+1: -2147483647
MiniValue-1: 2147483647
对于上述操作,总结如下
下面用二进制来解释
最小值为 0x10000000====>10000000 00000000 00000000 00000000
最大值为0x7FFFFFFF=====>01111111 11111111 11111111 11111111
最小值-1=01111111 11111111 11111111 11111111======》转化为十进制要按照two's complement的操作来弄,就过就是上面那样
最大值+1=10000000 00000000 00000000 00000000======》转化为十进制要按照two's complement的操作来弄,就过就是上面那样
接下来会讨论float和double以及如何判断溢出。