做到算法题有关int 范围的限定,借机复习一波
大家都知道数据在计算机存储的形式的补码,正数的补码是它本身,负数的补码是取反后加1 所以32位有符号的int范围是[- 231,231-1]
32位有一个位用来做符号位 因此对于正数,最大值是0 11111……1,即231-1 对于负数,因为是补码形式存储,当补码形式位 1 000……0时,转为源码就变成了 1(符号位) 1(新进位的1) 0000……,因此负数的最小值为-231 所以简单地说就是 补码1 000……0,代表了原码 1(符号位) 1(进位) 000……0,
对于java来说
int x = Integer.MIN_VALUE; //int的最小值 System.out.println("x:"+x); int y = x -1; System.out.println("y:"+y);输出
x:-2147483648 y:2147483647x是int的最小值,加上-1后成了 231 -1,这是为什么呢 其实很容易理解
-1的补码为 1 111……1 -231的补码为 1 000……0
1 111……1 (32位) + 1 000……0 (32位) --------- 10 111……1 (33位) 因为只能存储32位,因此舍去掉最高位 得到 0 111……1(补) = 2^31-1