Java整数溢出疑问:int最大值二进制与计算逻辑解析
Java int最大值的二进制与数值逻辑解析
核心规则:Java int采用32位补码存储
Java的int是32位有符号整数,遵循补码存储规则:
- 最高位(从0开始计数的第31位)为符号位:0代表正数,1代表负数
- 剩余31位(第0位到第30位)是数值位,用于承载具体数值
为什么最大值是「符号位0+其余全1」?
正数的补码与原码完全一致,要得到最大的正数,只需让所有数值位取最大值1,同时符号位保持0(标识正数),对应的二进制就是0111 1111 1111 1111 1111 1111 1111 1111。
数值计算:为什么只算到2^30?
二进制每一位的权重是2的位索引次方:
- 最右侧的第0位权重是
2^0 - 第1位权重是
2^1 - ...
- 第30位(最后一个数值位)权重是
2^30
所有数值位全1的和是等比数列求和:2^0 + 2^1 + ... + 2^30 = 2^(30+1) - 1 = 2^31 - 1 = 2147483647
这正是Integer.MAX_VALUE的十进制值。
关于2^31的误解
2^31对应的二进制是1000 0000 0000 0000 0000 0000 0000 0000,但在补码规则里它不代表正数2147483648:
- 最高位为1,标识这是负数
- 补码中负数的数值计算规则是:符号位权重为
-2^31,其余位取反加1得到原码。这个二进制作为补码,对应原码就是-2147483648,也就是Integer.MIN_VALUE。
总结
Java int的取值范围由32位补码规则直接决定:
- 最大值:符号位0 + 31位数值位全1,对应十进制
2^31 - 1 - 最小值:符号位1 + 31位数值位全0,对应十进制
-2^31
内容的提问来源于stack exchange,提问作者Tholkappiar
相关产品推荐
相关产品推荐

