java表達式中類型的自動提升
發表于:2007-07-14來源:作者:點擊數:
標簽:
除了賦值,還有另外一種類型變換:在表達式中。想要知道原因,往下看。在表達式中,對中間值的精確要求有時超過任何一個操作數的范圍。例如,考慮下面的表達式:byte a = 40;byte b = 50;byte c = 100;int d = a * b / c;中間項結果a*b 很容易超過它的任何一
除了賦值,還有另外一種類型變換:在表達式中。想要知道原因,往下看。在表達式中,對中間值的精確要求有時超過任何一個操作數的范圍。例如,考慮下面的表達式: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 類型。
原文轉自:http://www.anti-gravitydesign.com