java表示式中型別的自動提升(轉)

ba發表於2007-08-15
java表示式中型別的自動提升(轉)[@more@]除了賦值,還有另外一種型別變換:在表示式中。想要知道原因,往下看。在表示式中,對中間值的精確要求有時超過任何一個運算元的範圍。例如,考慮下面的表示式: byte a = 40; byte b = 50; byte c = 100; int d = a * b / c; 中間項結果a*b 很容易超過它的任何一個byte 型運算元的範圍。為處理這種問題,當分析表示式時,Java 自動提升各個byte 型或short型的運算元到int 型。這意味著子表示式a*b 使用整數而不是位元組型來執行。這樣,儘管變數a和b都被指定為byte 型,50*40 中間表示式的結果2000 是合法的。自動型別提升有好處,但它也會引起令人疑惑的編譯錯誤。例如,這個看起來正確的程式卻會引起問題: byte b = 50; b = b * 2; // Error! Cannot assign an int to a byte! 該程式試圖將一個完全合法的byte 型的值50*2 再儲存給一個byte 型的變數。但是當表示式求值的時候,運算元被自動地提升為int 型,計算結果也被提升為int 型。這樣,表示式的結果現在是int 型,不強制轉換它就不能被賦為byte 型。確實如此,在這個特別的情況下,被賦的值將仍然適合目標型別。在你理解溢位的後果的情況下,你應該使用一個顯式的強制型別轉換,例如: byte b = 50; b = (byte)(b * 2); 它產生出正確的值100 。 3.10.1 型別提升的約定除了將byte 型和shorts 型提升到int 型以外,Java 定義了若干適用於表示式的型別提升規則(type promotion rules )。首先,如剛才描述的,所有的byte 型和short型的值被提升到 int 型。其次,如果一個運算元是long 型,整個表示式將被提升到long 型;如果一個運算元是float 型,整個表示式將被提升到float 型;如果有一個運算元是double 型,計算結果就是double 型。下面的程式表明:在表示式中的每個值是如何被提升以匹配各自二進位制運算子的第二個引數: class Promote { public static void main(String args[]) { byte b = 42; char c = 'a'; short s = 1024; int i = 50000; float f = 5.67f; double d = .1234; double result = (f * b) + (i / c) - (d * s); System.out.println((f * b) + " + " + (i / c) + " - " + (d * s)); System.out.println("result = " + result);}} 讓我們進一步看看發生在下列程式行的型別提升: double result = (f * b) + (i / c) - (d * s); 在第一個子表示式f*b 中,變數b被提升為float 型別,該子表示式的結果當然是float 型別。接下來,在子表示式i/c,中,變數c被提升為int 型別,該子表示式的結果當然是int 型別。然後,子表示式d*s 中的變數s被提升為double 型別,該子表示式的結果當然也是double 型別。最後,考慮三個中間值,float 型別,int 型別,和double 型別。float 型別加int 型別的結果是float 型別。然後float 型別減去提升為double 型別的double 型別,該表示式的最後結果是double 型別。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章