最大值和最小值的操作处理

在写代码的时候,尤其是数字计算的时候,我们会经常碰到计算边界的问题,也就是说溢出的问题,比如说:最小的负数-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以及如何判断溢出。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值