以java语言为例
int
型的基本类型占4个字节,也就是32bit, 其中的第一位表示符号(1为负数,0为正数)。其余的31位用于表示数字。
所以int型的最大数为
System.out.println("最大值10进制:" + Integer.MAX_VALUE);
String max2 = String.valueOf((int)(Math.pow(2, 31) - 1));
System.out.println("2^31 - 1 = " + max2);
String max = Integer.toBinaryString(Integer.MAX_VALUE);
System.out.println("最大值2进制:" + max);
输出
最大值10进制:2147483647
2^31 - 1 = 2147483647
最大值2进制:1111111111111111111111111111111
// 注意: 2进制只输出了31位,正数的符号省略了
所以
int
型的最大值就是
2
31
−
1
=
1111111111111111111111111111111
2^{31}-1 = 1111111111111111111111111111111
231−1=1111111111111111111111111111111
我们再看最小值
System.out.println("最小值10进制:" + Integer.MIN_VALUE);
String min2 = String.valueOf((int)(Math.pow(2, 31) * -1));
System.out.println("-2^31 = " + min2);
String min = Integer.toBinaryString(Integer.MIN_VALUE);
System.out.println("最小值2进制:" + min);
输出
最小值10进制:-2147483648
-2^31 = -2147483648
最小值2进制:10000000000000000000000000000000
// 注意:这是32位, 输出了符号位
是不是和想的不一样
为什么int
型的最小值不是32个1呢?
正常情况下,会存在
+
0
=
00000.....
+0 = 00000.....
+0=00000.....(32个0)
−
0
=
10000....
-0 = 10000....
−0=10000.... (31个0)
为了避免计算机来判断+0/-0, 所以计算使用的补码,这时+0和-0的补码就一样的,只存在0了,
所以就把
0000.....
0000.....
0000.....(32个0)当做了0,也就是符号为0表示的是非负数,
而
−
0
=
10000....
-0 = 10000....
−0=10000.... (31个0)则表示了32位下的最小值
−
(
2
31
−
1
)
−
1
=
−
2
31
-(2^{31}-1) -1 = -2^{31}
−(231−1)−1=−231
其实上述的问题不是为什么int
型的最大数为什么是
2
(
31
)
−
1
2^(31) -1
2(31)−1,而是为什么int
型下负数为什么比整数多一个
以上为个人理解,如存在问题请指正,谢谢