Java编程:Integer的取值范围(-2^31~2^31-1)分析
Posted 志波同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java编程:Integer的取值范围(-2^31~2^31-1)分析相关的知识,希望对你有一定的参考价值。
在 Java 中 Integer 的最小值、最大值定义如下:
/**
* A constant holding the minimum value an @code int can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an @code int can
* have, 2<sup>31</sup>-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。
以上是关于Java编程:Integer的取值范围(-2^31~2^31-1)分析的主要内容,如果未能解决你的问题,请参考以下文章