Java中Integer的最大值和最小值

时间:2021-09-13 15:14:54

Q1:谁能给解释一下,这两个常量为什么会分别定义成0x800000000x7fffffff
Q2
java.lang.String的最大长度是多少?
Q3
:如下代码能抛出异常吗?为什么

int x = Integer.MAX_VALUE+10;
if(x >= Integer.MAX_VALUE || x <= Integer.MIN_VALUE){
//throw exception
}

Q1:

四字节的整形 有符号是 -2^31~2^31-1 ;在计算机内部数值的二进制表示,有正码、反码和补码。一般采用二进制补码进行表示和运算,MIN_VALUE
= 0x80000000
  MAX_VALUE = 0x7fffffff 就是补码表示的Integer的最小值(-2^31)和最大值(2^31-1)。至于为什么采用补码表示,简单的说就是方便运算,详细可自行Google一下或找本基础教材翻一下。至于Integer的最大值最小值为什么是这两个数,这是因为Java语言规范规定int型为4字节,不管是32/64位机器,这就是其所宣称的跨平台的基础部分。


Q2:

   #String的关键字段
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0

String 的最大长度取决于其内部数据表示。 String 内部是通过 char 数组表示,数组的长度在 Java 中限制为一个 int 型所能表示的最大值,即 Q1 中的   MAX_VALUE
= 0x7fffffff
  。这点通过其内部表示偏移量 int offset 和长度 int count 的属性可以体现。


Q3:

intx = Integer.MAX_VALUE+10; x溢出了,x实际为-2^31+9if条件不成立,不会抛出异常。

上述代码不会抛出异常,对于超出表示范围的数值,采取的策略是截断效应,即直接截取低位,抛弃超出范围的高位信息,这就是所谓的溢出。例如int型的运算结果若超出表示范围,则直接截取低32(Q14个字节)作为运算结果。由此,上述代码第1行会溢出,溢出后的结果导致第2行的条件判断为假。