java基本數據類型所占用的內存空間大小


一、基本數據類型

  Java語言提供了八種基本類型。六種數值類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。

  java中基本數據類型中沒有無符號類型(C、C++中有),只有有符號類型。

 

在計算機內,定點數有3種表示法:原碼、反碼和補碼

原碼 :二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
反碼 :正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼 :正數的補碼與其原碼相同;負數的補碼是將其原碼的除符號位外的所有位,逐位取反,然后加1。

 

  計算機中數據的運算都是通過補碼進行的。

  反碼是為了解決減法運算,補碼是為了解決反碼產生的±0的問題。

  計算機中負數是用補碼的形式保存、並用它參與加減法運算的,減法會被轉換為加法,計算機中沒有減法運算。

在計算機中減法運算可以轉換成加法運算,比如8-1 -->  8+(-1) = 7

  • 原碼:

     8:   0000 1000

    -1:  1000  0001 

  • 反碼:

    8:   0000 1000

     -1:   1111  1110

  • 補碼:

    8: 0000  1000

      -1: 1111   1111

  • 補碼運算:

        (0000 1000) + (11111111) =  0000 0111  -->   4+2+1=7

 

比如:-128+127  -->  127+(-128) = -1

     0111 1111  + (1000 0000) = 1111 1111(補碼)  --> 1111 1110(反碼) -->  1000 0001(原碼)  -->  -1  

  

計算機都是以補碼來存儲的:
   ⑴一個數為正,則它的原碼、反碼、補碼相同。
   ⑵一個數為負,則符號位為1,其余各位是對原碼取反(符號位不變),然后整個數加1。

先用一個正數1舉例

原碼:0000 0001

反碼:0000 0001

補碼:0000 0001

正數的原碼=反碼=補碼

 

對於-1來說

原碼:1000 0001

反碼:1111 1110(符號位不變,其他相反)

補碼:1111 1111(補碼是反碼+1)

  Java中用補碼表示二進制數。

 

1、數值類型

 (1)byte    

    • byte數據類型是8位、有符號的以二進制補碼表示的整數;(1字節 = 8位  )  Java中正數用源碼表示,負數用補碼表示,第一位是符號位。

    • 最小值是 -128(-2^7);

    • 最大值是  127(2^7-1)  

參考鏈接:

https://blog.csdn.net/Rex_WUST/article/details/88419881?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

+0的原碼是0000 0000

-0的原碼是1000 0000

實際上,”+0“和“-0”的原碼統一為0000 0000

1000 0000沒有使用(避免浪費),所以就將其分給了最小的負數 -128。

    • 默認值是0;

    • byte類型用在大型數組中節約空間,主要代替整數,因為byte變量占用的空間只有int類型的四分之一;
public class Test12 {
    public static void main(String[] args) {
        byte a = 127;
        System.out.println(a); //127
    }
}

相關面試題: 鏈接來源:

https://blog.csdn.net/lexiaowu/article/details/100056525?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

  Java面試題 :byte a = (byte)128; 定義變量語句是否正確 

  

public class Test12 {

  public static void main(String[] args) {

    byte a = (byte) 128;

    System.out.println(a);

  }

}

正確

1. 首先,分析基本數據類型

    • 只寫128,說明128是整型(int類型)

    • 128L 或128F 等等,說明是long類型(L),單精度浮點類型(F)

    • (byte)128中128是整型(int),只不過是強制類型轉換為了 字節類型(byte)

2、byte b = (byte)128; 只出現了 字節類型(byte)和整型(int),對兩者具體分析

    • 整型(int)在內存中占32位(4字節)

    • 字節類型(byte)在內存中占8位

      • 所以,經過強制類型轉換,把int類型轉化為byte類型,byte只保存了int類型的低8位,其它位都舍棄

      • 有符號類型,最高位都是符號位, 1表示負數, 0表示正數

    • 如下圖解釋:          

           

3. 分析128

       用-0的二進制補碼表示到了 -128里面。

public class Test12 {
    public static void main(String[] args) {
        byte a = (byte) 128;
        System.out.println(a); //-0 --> -128
      
     int類型:

原碼:0000 0000 0000 0000 0000 0000 1000 0000

反碼:0000 0000 0000 0000 0000 0000 1000 0000

補碼:0000 0000 0000 0000 0000 0000 1000 0000

     byte類型截取后8位,即:

原碼:1000 0000(最高位為1,表示負數)

反碼:1111 1111

補碼:1000 0000(在補碼的過程中,符號位不能改變),1000 0000表示的是最小值,所以是-128,這叫上溢

        byte b = (byte) 129;
        System.out.println(b); //-127

  int類型:

原碼:0000 0000 0000 0000 0000 0000 1000 0001 

反碼:0000 0000 0000 0000 0000 0000 1000 0001 

補碼:0000 0000 0000 0000 0000 0000 1000 0001 

  byte類型: 

原碼:1000 0001

反碼:1111 1110

補碼:1111 1111(也就是-127)

        byte c = -128;
        System.out.println(c); //-128

        byte d = (byte) (-129);
        System.out.println(d); //127

int類型存儲

原碼:1000 0000 0000 0000 0000 0000 1000 0001

反碼:1111 1111 1111 1111 1111 1111 0111 1110

補碼:1111 1111 1111 1111 1111 1111 0111 1111

  byte類型

原碼:0111 1111

反碼:0111 1111

補碼:0111 1111(值是127)

    }
}
byte: -128 ~ 127
  • 對於整數超出取值范圍時:

    1、首先要計算出數據的二進制

    2、做截取操作,截成byte類型(取低8位)

    3、截取8位后,求補碼

 

 (2)short

    • short數據類型是16位、有符號的以二進制補碼表示的整數。(2字節)

    • 最小值是 -32768(-2^15);

    • 最大值是  32767(2^15 - 1);

    

    • Short數據類型也可以像byte那樣節省空間。一個short變量是int型變量所占空間的二分之一;

    • 默認值是0;

public class Test12 {
    public static void main(String[] args) {
       
        short s = 1000;
        System.out.println(s); //1000

        short r = -20000;
        System.out.println(r); //-20000
    }
}

 

 

  (3)int

    • int數據類型是32位、有符號的以二進制補碼表示的整數;(4字節)

    • 最小值是 -2147483648(-2^31);

    • 最大值是  2147483647(2^31 - 1);

    • 一般地整型變量默認為int類型;

    • 默認值是0;

 

  (4)long

    • long數據類型是64位、有符號的以二進制補碼表示的整數;(8字節)

    • 最小值是 -9223372036854775808(-2^63);

    • 最大值是  9223372036854775807(2^63 -1);

    • 這種類型主要使用在需要比較大整數的系統上;

    • 默認值是0L;

 

  (5)float

    • float數據類型是單精度、32位、符合IEEE 754標准的浮點數;(4字節)

    • float在儲存大型浮點數組的時候可節省內存空間;

    • 默認值是0.0f;

    • 浮點數不能用來表示精確的值,如貨幣;

    • 例子:float f1 = 234.5f。

 

  (6)double

    • double數據類型是雙精度、64位、符合IEEE 754標准的浮點數;(8字節)

    • 浮點數的默認類型為double類型;

    • double類型同樣不能表示精確的值,如貨幣;

    • 默認值是0.0d;

    • 例子:double d1 = 123.4。

 

2、字符類型

  (1)char

    • char類型是一個單一的16位Unicode字符;(2字節)

    • 最小值是’\u0000’(即為0);

    • 最大值是’\uffff’(即為65,535); 2的16次方 -1 (2^16 -1)

    • char數據類型可以儲存任何字符;

    • 例子:char letter = ‘A’。

           

public class Test12 {
    public static void main(String[] args) {

        System.out.println(Character.SIZE); //16
        // 以數值形式而不是字符形式將Character.MAX_VALUE輸出到控制台
        System.out.println((int)Character.MAX_VALUE); //65535
        System.out.println((int)Character.MIN_VALUE); //0
    }
}

 

 

3、布爾類型

 (1)boolean

    • boolean數據類型表示一位的信息;

    • 只有兩個取值:true和false;

    • 這種類型只作為一種標志來記錄true/false情況;

    • 默認值是false;

    • 例子:boolean one = true。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM