搜尋

首頁  >  問答  >  主體

Java中Integer的最大值和最小值

从JDK1.0开始,Integer中就定义了MIN_VALUEMAX-VALUE两个常量:

/**
 * A constant holding the minimum value an {@code int} can
 * have, -2<sup>31</sup>.
 */
public static final int   MIN_VALUE = 0x80000000;

/**
 * A constant holding the maximum value an {@code int} can
 * have, 2<sup>31</sup>-1.
 */
public static final int   MAX_VALUE = 0x7fffffff;

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

int x = Integer.MAX_VALUE+10;
if(x >= Integer.MAX_VALUE || x <= Integer.MIN_VALUE){ //throw exception}
巴扎黑巴扎黑2804 天前841

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 11:11:54

    Q1:

    四字節的整形 有符號是-2^31~2^31-1 (MIN_VALUE和MAX-VALUE的注釋裏也寫了),查下對應邊界的補碼二進製表示就清楚了

    Q2:

    java用的不多,不太清楚,應該可以很長,附上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
    

    Q3:

    int x = Integer.MAX_VALUE 10; x溢出了,x實際為-2^31 9,if條件不成立,不會拋出異常。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:11:54

    • Q1:計算機能理解的東西是二進製的01串。在計算機內部數值的二進製表示,有正碼、反碼和補碼。一般采用二進製補碼進行表示和運算,MIN_VALUE = 0x80000000MAX_VALUE = 0x7fffffff 就是補碼表示的Integer的最小值(-2^31)和最大值(2^31-1)。至於為什麼采用補碼表示,簡單的說就是方便運算,詳細可自行Google一下或找本基礎教材翻一下。至於Integer的最大值最小值為什麼是這兩個數,這是因為Java語言規範規定int型為4字節,不管是32/64位機器,這就是其所宣稱的跨平台的基礎部分。

    • Q2:String的最大長度取決於其內部數據表示。String內部是通過char數組表示,數組的長度在Java中限製為一個int型所能表示的最大值,即Q1中的 MAX_VALUE = 0x7fffffff 。這點通過其內部表示偏移量int offset和長度int count的屬性可以體現。

    • Q3:上述代碼不會拋出異常,對於超出表示範圍的數值,采取的策略是截斷效應,即直接截取低位,拋棄超出範圍的高位信息,這就是所謂的溢出。例如int型的運算結果若超出表示範圍,則直接截取低32位(Q1中4個字節)作為運算結果。由此,上述代碼第1行會溢出,溢出後的結果導致第2行的條件判斷為假。

    回覆
    0
  • 取消回覆