Primitive Data Type - PsMonkey 隨手筆記

文章推薦指數: 80 %
投票人數:10人

在Java 當中內建好的資料型態(primitive data type)有下列幾種: ... 既然每種不同資料型態有不同的範圍,而Java 又是一種Strong Type 的語言,所以下面這個程式的 ... PsMonkey隨手筆記搜尋這個協作平台 Java‎>‎ PrimitiveDataType 在程式中,我們需要去紀錄一些數值、資料,或是表示某些狀態,而在程式語言中負責這樣子的東西,我們稱之為變數。

用較「專業」的說法,就是程式在執行時,會在記憶體裡頭空出一些空間,用來存放資料以便程式能夠運作。

既然扯到記憶體,就理所當然的會扯到資料型態(datatype)以及資料表示法。

在Java當中內建好的資料型態(primitivedatatype)有下列幾種:  資料型態  記憶體中的bit量  範圍  boolean  8  true,false(只有兩個)  char  16  '\u0000'~'\uffff'(Unicode字集)  byte  8  整數:-128~127  short  16  整數:-32768~32767  int  32  整數:-2147483648~2147483647  long  64  -9223372036854775808~9223372036854775807  float[註1]  32  ±1.4E-45~±3.4028235E+38  double  64  ±4.9E-324~±1.79769313486231570E+308 這種顏色欄位的資料型態都是整數,差別在於範圍的大小;同樣的,這種顏色欄位的資料型態都是可以帶有小數點的實數,差別在於範圍的大小。

如果你的計算機概論學的還不錯,那整數的部分只要記得需要的bit數就可以了,後頭的範圍自然很容易推的出來。

至於實數...誰管它什麼範圍...(不要叫我背or算:P),不過要這裡提一下,以float為例,「±1.4E-45~±3.4028235E+38」的意思是「1.4E-45~3.4028235E+38」以及「-1.4E-45~-3.4028235E+38」兩個範圍的聯集,這邊只是偷懶的縮寫,相信記算機概論學過的都知道為什麼是這樣,忘記的就快快去翻書吧~ccc 既然每種不同資料型態有不同的範圍,而Java又是一種StrongType的語言,所以下面這個程式的錯誤就一定要避免囉: classerror1{ publicstaticvoidmain(Stringargs[]){ shortx_short; intx_int=5; x_short=x_int; System.out.println(x_short); }//endofmain() }//endofclasserror1 在compile的時候就會出現錯誤,告訴你compiler沒有辦法把int轉換成short。

遇到這種情形,你只要這樣子改就沒問題了: classamend_error1{ publicstaticvoidmain(Stringargs[]){ shortx_short; intx_int=5; x_short=(short)x_int; System.out.println(x_short); }//endofmain() }//endofclassamend_error1 (short)會幫你把x_int的數值強制轉換成short的格式。

當然,明明short的資料型態最大只能到32767,你要把一個在short範圍以外的值硬是轉換成short的格式,可就不要期望出來的結果是你想要的: classerror2{ publicstaticvoidmain(Stringargs[]){ shortx_short; intx_int=40000; x_short=(short)x_int; System.out.println(x_short); }//endofmain() }//endofclasserror2   這個程式在compile以及執行的時候都不會有問題,但是output的值是-25536。

由此觀之,為了程式的堅固耐用,還是不要隨意使用「(short)」這類的指令。

  其實,Java並沒有很徹底的StrongType,因為不是所有不同資料型態的變數扯在一起就會出問題,以下提供一個小小表格,給大家參考著用:    byte  short  char  int  long  float  double  byte    Y  C  Y  Y  Y  Y  short  C    C  Y  Y  Y  Y  char  C  C    Y  Y  Y  Y  int  C  C  C    Y  Y*  Y  long  C  C  C  C    Y*  Y*  float  C  C  C  C  C    C  double  C  C  C  C  C  C   C表示需要加入強制轉換的指令,才能正常運作。

Y表示JAVA會幫你作轉換的動作。

Y*跟Y的差別:JAVA不保證轉換後數值的精準度(因為資料儲存方式的關係)。

我們大致上可以歸類出一個結論:在Java中,如果(資料型態)範圍比較小的變數可以把值存入(資料型態)範圍比較大的變數、(資料型態)沒有小數點的變數可以把值存入(資料型態)有小數點的變數,而不需要在程式碼中加入轉換的指令(忽略Y*的精準度問題);反之,則需要經過轉換的過程,因為資料型態不同的關係,轉換完之後的值可能完全偏差掉。

另外,Java還有一個特別的地方。

如果你把一堆變數作算術運算、遞加遞減、bitwise運算,只要這堆變數當中,有一個以上是〔double〕型態,那整個式子最後的運算結果的傳回值也會是〔double〕型態,「〔〕」中型態辨別的依序是double→float→long;最後,如果式子當中沒有上面三種資料型態的變數,那麼「傳回值的資料型態就會是int」。

請特別注意這點,傳回值只會有這四種資料型態,即使你是把一堆char、byte、short變數下去運算,傳回值還是int的型態[註2]。

請看下面這個程式範例: classerror3{ publicstaticvoidmain(Stringargs[]){ bytea,c=3,b=10,d=-5; a=b+c-d; System.out.println(a); }//endofmain() }//endofclasserror3 這個程式在compiler的時候,會出現這樣子的錯誤訊息: C:\programs\Java>javacerror3.java error3.java:5:Incompatibletypefor=.Explicitcastneededtoconvertinttobyte.    a=b+c-d;    ^ 1error 所以,在這裡請特別注意喔~ [註1]這裡的數據跟數值表示方都是取自於O'REILLY出版的第三版《JAVA技術手冊》p.28頁。

但是在float的地方出了一點問題,因為上頭寫的數據跟俗稱「綠色螞蟻書」的《JAVAHOWTOPROGRAM3rdEdition》(由PRENTICEHALL出版,DEITEL系列)p.144所寫的不同。

在沒有旺盛的好奇心去查詢IEEE754的規格orSUN網站的資料,這裡採用JAVA技術手冊的資料,原因無他,因為這本書有標明underflow的上下界,而另一本書沒有。

特別在此註明一下,以示負責。

[註2]這裡不考慮boolean型態。

  Comments 瀏覽MyPortfolio軍旅生涯紀錄2010.11.122010.11.192010.11.262010.12.102010.12.242011.01.072011.02.262011.03.252011.05.202011.07.01AppEngineGPEobjectifyCSSGoogleGoogleSite技巧JavaArrays.sort()PrimitiveDataTypeSimpleDateFormat泛型用法memo雜項筆記Java3rdLib.iTextJS程式設計師參考書CH02:Browser中的JSCH13:DOM《拉奧孔》前言作品更新紀錄便當狗亂數圖片展示牆2012.01.282012.01.302012.02.022012.02.04對戰電腦版踩地雷2010.08.232010.08.262010.08.26-22010.09.022010.09.102010.09.182010.09.212010.09.222010.09.29[戰績]2010.09.29單天[戰績]2010.09.29~?[戰績]~2010.09.2312:00訪客影像2011.10.10城邦暴力團人物表地圖年表書目待處理清單書讀山文章我來,我見,我征服!無處正中運動生理學麻辣功夫王AIKI協作平台地圖最新協作平台活動 最近的協作平台活動讀山編輯者PsMonkeyobjectify編輯者PsMonkey讀山編輯者PsMonkeyAppEngine編輯者PsMonkey書由PsMonkey新增的項目ViewAll Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites



請為這篇文章評分?