Boolean類型數據到底占有幾個字節


 目前有三種說法:

 

一、1個bit(位)(1/8個字節)

  此說法只在存儲理論上成立。因為boolean類型的值只有true和false兩種邏輯狀態值,可以用1和0來表示,而在內存中0和1按位算僅需1位(bit)即可代表這個邏輯。但很明顯,這是很難說通的,因為計算機單次處理數據時絕對不可能一個bit一個bit的來。

 

二、1個字節

  當boolean類型數據是數組中的元素時,如boolean[] b = new boolean[10];   此時每一個boolean在JVM中占一個字節。

  從計算機處理數據的最小單位的角度出發,雖然編譯后1和0只需占用1位空間,但計算機處理數據的最小單位是1個字節,1個字節等於8位,實際存儲的空間是:用1個字節中的最低位bit來存儲,其他7位用0填補,即如果值是true的話則存儲的二進制為:0000 0001,如果是false的話則存儲的二進制為:0000 0000。

 

三、4個字節

  在《Java虛擬機規范》一書中的描述:“雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持”。接着又說——

    “在Java虛擬機中沒有任何供boolean值專用的字節碼指令,

    Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,

    而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位”

  也就是說JVM規范指出,會將Java表達式中的boolean類型數據當做int型數據處理,也就是4字節。但對於boolean數組當做byte數組處理,也就是每個boolean類型元素1個字節,這樣我們可以得出boolean類型單獨使用時占了4個字節,在數組中是確定的1個字節。

 

這又引出一個問題:那虛擬機為什么要在boolean類型數據在表達式中使用時就用int來代替boolean呢?為什么不用byte或short,這樣不是更節省內存空間嗎。經過查閱資料發現,使用int的原因是,對於當下32位的處理器(CPU)來說,一次處理數據是32位(這里不是指的是32/64位系統,而是指CPU硬件層面),32 位 CPU 使用 4 個字節是最為節省的,哪怕你是 1 個 bit 他也是占用 4 個字節。因為 CPU 尋址系統只能 32 位 32 位地尋址,具有高效存取的特點。

 

最后的總結:

  JAVA規范中沒有定義boolean類型的大小,但其到底占用了幾個字節,還是得依賴於虛擬機的具體實現,符合規范的虛擬機就是1字節或者4字節。

  當Boolean類型數據是數組中的元素時,就是1字節。

  當Boolean類型數據是在Java語言表達式中時,就是4字節。

 

 

《Java虛擬機規范》原文:

Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.  

Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding.  But:Java virtual machine type int, whose values are 32-bit signed two's-complement integers。

Arrays of type boolean are accessed and modified using the byte array instructions  

In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.

 


免責聲明!

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



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