leetcode奇技淫巧-int最大值与最小值溢出

文章目录

  • 前面
  • int 类型界限
  • 求边界错误代码
  • 求边界正确代码

前面

这是我在刷 leetcode 时候发现的一个问题,做个小记录

int 类型界限

Java 中 int 类型是 4 个字节,2 进制 32 位,默认是有符号的,所以只有 31 位是数字位,首位用于决定正数还是负数,但是我们发现 int 的界限值如下:

  • int 最大值: 2147483647
  • int 最小值:-2147483648

负数的绝对值比正数大 1

求边界错误代码

从上面我们可以发现,最小值的绝对值要比最大值大 1,一般这个数字我们也记不住,那我们就直接来求吧

int s = 1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
System.out.println(s);

结果是:

-2147483648

这不就是溢出了嘛,这时我们用 0 去减它,它依然不变
当我们再执行 s-1 的时候发现正好就是 int 最大值,所以我们要注意这一点,如果过我们开始另 s=-1,那最后不用加 1 或者减 1 就可以拿到 int 的最小值

求边界正确代码

方式一:

先算出最大再算最小

int s = 1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
// 最大值
System.out.println(s-1);
// 最小值
System.out.println(0-(s-1)-1);

方式二:

先算出最小,再算最大

int s = -1;
for (int i = 1; i <= 31; i++) {
	s *= 2;
}
// 最小值
System.out.println(s);
// 最大值
System.out.println(0-(s+1));

你可能感兴趣的:(#,LeetCode,奇技淫巧)