为什么int型的的最大值2^31-1而最小值为2^31呢

以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 2311=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} (2311)1=231

其实上述的问题不是为什么int型的最大数为什么是 2 ( 31 ) − 1 2^(31) -1 2(31)1,而是为什么int型下负数为什么比整数多一个

以上为个人理解,如存在问题请指正,谢谢

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值