說說Java基本數據類型

對於Java來說,數據類型大致分為兩類,分別為:基本數據類型和引用數據類型。至於引用數據類型,由於涉及的方面較廣,留待以後慢慢介紹,本篇只介紹基本數據類型。

說到基本數據類型,其分類大致分為三種:數值類型、字符類型和布爾類型。當然,偶爾也會將字符類型囊括到數值類型當中,因為,字符類型在內存是以Unicode編碼值存在的,所以從這一點來看,說字符類型是數值類型也不無道理。當然,本篇採用的觀點是分為三類。

數值類型

數值類型是用來表示數字的,又可以分為兩類,分別為:整數類型和浮點數類型。

  • 整數類型

對於整數類型來說,又可以分為四類,分別為:byte、short、int和long。它們的區別在於在內存所佔的位數和表示範圍的值。

byte: 佔8位,可表示-128(-2的7次方)~127(2的7次方減一)。

short: 佔16位,可表示-32768(-2的15次方)~32767(2的15次方減一)。

int: 佔32位,可表示-2147483648(-2的31次方)~2147483647(2的31次方減一)。

long: 佔64位,可表示-2的63次方~2的63次方減一。

我想大家肯定有所疑惑,為啥所佔位數為n, 可表示範圍確實-2的n-1次方到2的n-1次方減一。因為,數值在計算機中是以補碼的形式存在,最高位為符號位,所以一個數佔n位的情況下,只有n-1位可以用來表示數值。之所以正整數會比2的n-1次方少1,那是因為n-1位全為1的情況值為2的n-1次方減1。

至於補碼及相關知識,可以參考我的另一篇文章:聊聊原碼、反碼和補碼那些事

在Java中,不論聲明類型是什麼,整數默認都是int類型。下面我將給出例子證明一下,以byte類型的表示為例,示例代碼如下圖所示:

說說Java基本數據類型

首先byte最大表示範圍在-128~127範圍內,當所給整數在此範圍內時,雖然默認為int類型,但編譯器會進行自動類型轉換,將int類型的整數自動轉為為byte類型,但如果超出了byte的表示範圍,則無法進行自動類型轉換,從而發生錯誤。

short類型與byte類型一致。

對於long類型來說,表示範圍比int類型大,因此任何整數類型都能賦值給long類型。如果一個數值類型超出了int類型的表示範圍,那麼直接給long類型進行賦值時會發生錯誤,所以需要在整數後面加L或l後綴,表明該整數為long類型,若不加,該整數依然默認為int類型。示例代碼如下圖所示:

說說Java基本數據類型

對於整數類型來說,可以存在四種表示方式,分別為:二進制、八進制、十進制和十六進制。在計算機中的整數都是以二進制的形式存在,十進制為我們生活中常用的表示方式,至於八進制和十六進制會在特定場景下使用。

對於Java來說,二進制整數表示方式是Java7才有,需在前面加0b或0B,八進制整數需在前面加0,十進制表示方式則無任何前綴,十六進制整數是在前面加0x或0X。

關於整數的四種表示方式的示例如下圖所示:

說說Java基本數據類型

執行結果如下圖所示:

說說Java基本數據類型

  • 浮點類型

所謂浮點類型的數就是我們日常所見的小數。浮點數分為兩種類型,分別為:float類型和double類型。在Java中,浮點數默認為double類型,如需使用float類型,則需要在後面加F或f,通常加F。

其中,float類型也叫單精度浮點數,佔4個字節,共32位,而double類型也叫雙精度浮點數,佔8個字節,共64位。需要說明一點的是,浮點數用的是科學計數法,因此其表示的數只是一個近似值。如果需要精確的小數,可以考慮:java.util.BigDecimal類。

對於浮點數來說,其有著固定的表數範圍和字段長度,其中,float類型的首位為符號位,之後的8位表示指數,23位表示尾數。而double類型的首位為符號位,之後的11位表示指數,之後的52位表示尾數。

浮點數的表示方式只有兩種,分別是:十進制表示法和科學計數法。下面給出兩種表示方式的例子。

說說Java基本數據類型

執行結果如下圖所示:

說說Java基本數據類型

需要說明的是,科學計數法中的e可以理解為10的幾次方。如e2即10的2次方。還有一點需要強調的是,只有浮點數才可以使用科學計數法,如:12E2是一個浮點數,而1200則是一個int類型的整數。

浮點數中提供了三個特殊的浮點值,分別為:正無窮大、負無窮大和非數。任意的正浮點數除以0得到正無窮大,任意的負浮點數除以0得到負無窮大,0.0除以0得到非數。在float對應的包裝類Float和double對象的包裝類Double中,用POSITIVE_INFINITY表示正無窮大,用NEGATIVE_INFINITY表示負無窮大,用NaN表示非數。其中,定義的代碼如下圖所示:

說說Java基本數據類型

Float中關於正負無窮大和非數的定義

說說Java基本數據類型

Double中關於正負無窮大和非數的定義

需要強調的是,所有的正無窮大都相等,所有的負無窮大都相等,而所有的非數都不相等,包括NaN和自身都不相等。證明的例子如下圖所示:

說說Java基本數據類型

執行結果如下圖所示:

說說Java基本數據類型

字符類型

字符類型是用單引號(')包括起來的字符。在Java中的字符佔16位,2個字節,使用的是Unicode編碼,可以支持ASCII字符及各個國家的字符,被稱為萬國碼。

對於Java中的字符來說有三種表示方式:

  1. 直接使用單引號進行包括,如:'a','b'等。
  2. 使用轉義字符,如:'\t'、'\n'、‘\b’等。
  3. 使用Unicode編碼,類似\uXXXX的形式。中文字符的範圍是\u4e00到\u9fa5。

字符三種表示方式的示例代碼如下圖所示:

說說Java基本數據類型

執行結果如下圖所示:

說說Java基本數據類型

對於Unicode字符編碼來說,其表示範圍是從\u0000到\uFFFF,總共可以表示65535個字符。其中前255個(\u000-\u00FF)與ASCII的編碼重合。

正因為計算機中保存的字符都是以其對應的編號進行存儲,因此char類型的值可以當做整型值來進行算術運算,相當於一個16位的無符號整數,取值範圍為:0-65535。

關於字符的進行算術運算的示例如下圖所示:

說說Java基本數據類型

執行結果如下圖所示:

說說Java基本數據類型

至於上述例子為何會使用強制類型轉換,那是因為表達式提升所導致。關於表達式類型提升等以後有功夫在詳細介紹。

最後需要強調一點,只要是在JVM中的字符編碼,都是Unicode編碼,也就是所謂的\uXXXX,都是整數,但如果是別的平臺, 如操作系統或瀏覽器中的編碼才會有GBK或UTF-8之類的劃分。

布爾類型

布爾類型只有一種,那就是boolean。而它的值也只有兩個,分別是:true和false。如果我沒記錯的話,C或C++的布爾類型的值還可以用0或1來表示,但是在java中是不允許的。

布爾類型常用來作為條件判斷,從而控制循環或分支。當然,三目表達式中也會用到布爾類型。

由於布爾類型比較簡單,所以這裡只上一個小例子。

說說Java基本數據類型

自此,關於Java中基本數據類型的介紹便算完畢,希望大家都能掌握。


分享到:


相關文章: