1. 程式人生 > >Java之int及它的取值範圍

Java之int及它的取值範圍

int是Java中的8種基本型別之一,一個int值佔4個byte(8個二進位制位)

8中基本型別所佔位元組分別是多少:

  • int  4個位元組
  • short  2個位元組
  • long  8個位元組
  • char  2個位元組
  • float  4個位元組
  • double  8個位元組
  • boolean 沒有提供size的方法

思考:一個int,它的取值範圍是多少呢?在記憶體中又是怎麼儲存的呢?

答案:它的取值範圍是:【-2的31次方(-2147483648),2的31次方減一(2147483647)】,它在記憶體中是以補碼(對應正數的二進位制位取反,加1)的形式儲存的

先上程式碼,通過下面程式碼的執行結果觀察

public class Test {
 
    public static void main(String[] args) {
        // 2的31次方
        int j = (int) Math.pow(2,31);
        System.out.println("j的值" + j);
    }
}

執行結果:
j的值2147483647

繼續修改程式碼

public class Test {
 
    public static void main(String[] args) {
        // 2的31次方
        int j = (int) Math.pow(2,32);
        System.out.println("j的值" + j);
    }
}

執行結果(同上面程式碼):
j的值2147483647

再次修改程式碼

public class Test {
 
    public static void main(String[] args) {
        int j = 2147483647;
        System.out.println("j的值" + (j + 1));
    }
}


執行結果:
j的值-2147483648

這裡是負值,int型最小值

當int的最大值+1後,會變成int的最小值

故:java中int的取值範圍是2的32次方,最大值是2的31次方,最小值是負值的2的31次方-1
 

首先要明確兩個概念:(1)一個數在計算機中儲存的是它的補碼

(2)Math.abs(a)中的-a對應計算機在內部的操作是:將a在計算機中的儲存值(a的補碼)所有位(32位)取反之後加1。

因此,-128在計算機中儲存的是它的補碼(它對應的正數的所有位取反+1):

128用二進位制表示是:00000000 00000000 00000000 10000000

128所有位取反是:11111111 11111111 11111111 01111111

加1之後是:11111111 11111111 11111111 10000000(這個就是-128在計算機中儲存的值(補碼))

如果我們呼叫Math.abs(-128),機器會怎麼做呢?

首先,取反:00000000 00000000 00000000 01111111

加一:00000000 00000000 00000000 10000000(128)

因此Math.abs(-128)的結果就是128.

同理,Math.abs(-2147483648)也是這樣的操作:

-2147483648在計算機中儲存的值是:10000000 00000000 00000000 00000000

Math.abs(-2147483648)中 -a操作,首先取反:01111111 11111111 11111111 11111111

然後加一:10000000 00000000 00000000 00000000

而上面這個數,計算機識別為-2147483648

補充知識:

對於正數來說,它的補碼就是它本身

對於負數來說,它的補碼是它對應的正數的二進數所有位取反之後加一

由負數的補碼求原碼也是相同的操作(所有位取反+1)即為該負數的絕對值

int是4個位元組,32位,

10000000 00000000 00000000 00000000  是補碼,第一位為符號位,1表示負數,所以

對剩下的位取反,結果為 1111111 11111111 11111111 11111111,加一後為10000000 00000000 00000000 00000000

所以原碼指的是-2^31=-2147483648

int的取值範圍為-2^31——2^31-1

在計算機中,負數的補碼為:正值二進位制取反+1

注意: 1111111 11111111 11111111 11111111表示-1