Java-02.06-11

數據類型和分類

簡介

在這裏插入圖片描述

  • 數據類型分類
    1.基本數據類型/原生數據類型:
    2.引用數據類型/對象數據類型:

在這裏插入圖片描述

布爾類型

簡介

在這裏插入圖片描述

  • 必須要賦值才能用

整數類型(byte-short-int-long)

簡介

在這裏插入圖片描述
在這裏插入圖片描述

  • java7可以加下劃線 0b00000000_01101110

在這裏插入圖片描述

  • 默認是int

小數類型(float-double)

簡介

  • 默認是double類型
  • 3.14E2 表示 314.0
  • 表示小數float 和double 不精確
  • 必須有小數點
  • 科學計數法返回double
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 不精確
    101.11 就等於 1 * 2^2 +0 2^1 + 12^0 + 12^-1 + 12^-2 = 4+0+1+1/2+1/4 = 5.75
    在這裏插入圖片描述

  • float 的存儲
    OK,有了上面的知識,我們進入正題:看看float類型在內存中是如何表示的。
    float類型又稱爲單精度浮點類型,在 IEEE 754-2008 中是這樣定義它的結構的:

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    31 30 23 22 0

float類型總共4個字節——32位:

符號位
其中最左邊的爲符號位,0爲正,1爲負。
指數
接下來的E是指數,一共8位,也用二進制來表示。
尾數
最後的F是小數部分,尾數正是由這23位的小數部分+1位組成的。(這個稍後解釋)。
這裏我們需要多說一下指數。雖然指數也是用8位二進制來表示的,但是IEEE在定義它的時候做了些手腳,使用了偏移來計算指數。

IEEE規定,在float類型中,用來計算指數的偏移量爲127。也就是說,如果你的指數實際是0,那麼在內存中存的就是0+127=127的二進制。稍後我們來看這個到底如何使用。

好了,看了這麼多,我們該演示一下計算機如何將一個十進制的實數轉換爲二進制的。就拿6.9這個數字來舉例吧。-_-||!

首先,我們按照上面說的方法,分別將整數和小數轉換成對應的二進制。這樣6.9的二進制表示就是110.1110011001100…。這裏就看出來 了,6.9轉換成二進制,小數部分是無限循環的,這在現在的計算機系統上是無法精確表示的。這是計算機在計算浮點數的時候常常不精確的原因之一。

其次,將小數點左移(或右移)到第一個有效數字之後。說的通俗些,就是把小數點移到第一個1之後。這樣的話,對於上面的110.1110011001100…我們就需要把小數點左移2位,得到1.101110011001100…。

接下來的事情就有意思了。首先我們把得到的1.101110011001100…這個數,從小數點後第一位開始,數出23個來,填充到上面float內存 結構的尾數部分(就是那一堆F的地方),我們這裏數出來的就是10111001100110011001100。這裏又要發生一次不精確了,小數點後超出 23位的部分都將被捨棄,太慘了。

不過,這裏有一個可能讓大家覺得特別坑爹的事情,就是小數點前面的1也不要了。仔細看看上面的內存結構,確實沒有地方存放這個1。原因是這樣的:IEEE覺 得,既然我們大家都約定把小數點移動到第一個有效數字之後,那也就默認小數點前面一定有且只有一個1,所以把這個1存起來也浪費,乾脆就不要了,以後大家 都這麼默契的來就好。這也是爲什麼我上面說尾數是23位+1位的原因。

填充完尾數,該填充指數了。這個指數就是剛纔我們把小數點移動的位數,左移爲正,右移爲負,再按照上面所說的偏移量算法,我們填充的指數應該是2+127=129。轉換成8位二進制就是10000001。

最後,根據這個數的正負來填充符號位。我們這裏是正數,所以填0。這樣6.9的在內存中的存儲結果就出來了:

0 10000001 10111001100110011001100

總結一下,實數轉二進制float類型的方法:

A. 分別將實數的整數和小數轉換爲二進制
B. 左移或者右移小數點到第一個有效數字之後
C. 從小數點後第一位開始數出23位填充到尾數部分
D. 把小數點移動的位數,左移爲正,右移爲負,加上偏移量127,將所得的和轉換爲二進制填充到指數部分
E. 根據實數的正負來填充符號位,0爲正,1爲負

如果需要把float的二進制轉換回十進制的實數,只要將上面的步驟倒着來一邊就行了。


字符類型(char)

簡介

  • ASCII
    ASCII 是用來表示英文字符的一種編碼規範。每個ASCII字符佔用1 個字節,因此,ASCII 編碼可以表示的最大字符數是255(00H—FFH)。這對於英文而言,是沒有問題的,一般只什麼用到前128個(00H–7FH,最高位爲0)。而最高位爲1 的另128 個字符(80H—FFH)被稱爲“擴展ASCII”,一般用來存放英文的製表符、部分音標字符等等的一些其它符號。
    但是對於中文等比較複雜的語言,255個字符顯然不夠用。於是,各個國家紛紛制定了自己的文字編碼規範,其中中文的文字編碼規範叫做“GB2312—80”, 它是和ASCII 兼容的一種編碼規範, 其實就是利用擴展ASCII沒有真正標準化這一點,把一箇中文字符用兩個擴展ASCII 字符來表示,以區分ASCII 碼部分。
    但是這個方法有問題,最大的問題就是中文的文字編碼和擴展ASCII 碼有重疊。而很多軟件利用擴展ASCII 碼的英文製表符來畫表格,這樣的軟件用到中文系統中,這些表格就會被誤認作中文字符,出現亂碼。另外,由於各國和各地區都有自己的文字編碼規則,它們互相沖突,這給各國和各地區交換信息帶來了很大的麻煩。

  • Unicode是一種編碼方式,用來對a和97映射
    要真正解決這個問題,不能從擴展ASCII 的角度入手,UNICODE作爲一個全新的編碼系統應運而生,它可以將中文、法文、德文……等等所有的文字統一起來考慮,爲每一個文字都分配一個單獨的編碼。
    在這裏插入圖片描述

在這裏插入圖片描述

  • u 代表unicode,十六進制
  • unicode前256和ascii一樣

最常用的引用類型String

簡介

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章