java中i的取值范围_Java编程:Integer的取值范围(-2^31~2^31-1)分析

在 Java 中 Integer 的最小值、最大值定义如下:

/** * A constant holding the minimum value an {@code int} can * have, -231. */

@Native public static final int MIN_VALUE = 0x80000000;

/** * A constant holding the maximum value an {@code int} can * have, 231-1. */

@Native public static final int MAX_VALUE = 0x7fffffff;

最小值为 -2^31,最大值为 2^31-1,为什么呢?推导过程如下:

Integer 实际占用的二进制码的位数

一个 Integer 类型占 4 字节,一个字节占 8 位二进制码,因此一个 Integer 总共占 32 位二进制码。去除第一位的符号位,剩下 31 位来表示数值。

原码、反码、补码

在计算机中,数据是由二进制补码进行存储的,在 Java 代码中我们看到的 “0x80000000”、“0x7fffffff”都是补码的形式,通过转换为原码获取它们的真实值。

MIN_VALUE = 0x80000000; //补码

MAX_VALUE = 0x7fffffff; //补码

转换公式:

当原码为正数的时候,正数的原码、反码、补码都相同。

正数:1

原码:0000 0000 0000 0000 0000 0000 0000 0001

反码:0000 0000 0000 0000 0000 0000 0000 0001

补码:0000 0000 0000 0000 0000 0000 0000 0001

当原码为负数的时候,反码为去除符号位按位取反,补码为去除符号位按位取反再加1。

负数:-1

原码:1000 0000 0000 0000 0000 0000 0000 0001

反码:1111 1111 1111 1111 1111 1111 1111 1110

补码:1111 1111 1111 1111 1111 1111 1111 1111

因此在程序中,我们定义 16 进制整形数时, 0x00000001表示 1,0xFFFFFFFF表示 -1。

最大值为什么是 2^31-1,不是 2^31

原码:0111 1111 1111 1111 1111 1111 1111 1111

反码:0111 1111 1111 1111 1111 1111 1111 1111

补码:0111 1111 1111 1111 1111 1111 1111 1111

计算机中可表示的整数最大值的补码为“0111 1111 1111 1111 1111 1111 1111 1111”,正数的补码与原码一致,原码也为“0111 1111 1111 1111 1111 1111 1111 1111”,转换为十进制数为 2^31-1。

最小值为什么是 -2^31,而不是 -(2^31-1)

我们依次推算负数值,如下:

原码:1000 0000 0000 0000 0000 0000 0000 0001 -1

反码:1000 0000 0000 0000 0000 0000 0000 0000

补码:1111 1111 1111 1111 1111 1111 1111 1111

原码:1000 0000 0000 0000 0000 0000 0000 0010 -2

反码:1000 0000 0000 0000 0000 0000 0000 0001

补码:1111 1111 1111 1111 1111 1111 1111 1110

原码:1111 1111 1111 1111 1111 1111 1111 1111 -2^31 + 1

反码:1111 1111 1111 1111 1111 1111 1111 1110

补码:1000 0000 0000 0000 0000 0000 0000 0001

原码:1000 0000 0000 0000 0000 0000 0000 0000 -0 约定为 -2^31

反码:1111 1111 1111 1111 1111 1111 1111 1111

补码:1000 0000 0000 0000 0000 0000 0000 0000

由此可以推算,Integer 的最小值为 -2^31。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值