類型提升的約定 除了將byt型和short型提升到int型以外,java定義了若干適用于表達(dá)式的類型提升規(guī)則(type PRomotion rules). 首先,如剛才描述的,所有的byte型和short型的值被提升到int型.其次,假如一個(gè)操作數(shù)是long型,整個(gè)表達(dá)式將被提升到long型;假如一個(gè)操作數(shù)是float型,整個(gè)表達(dá)式將被提升到float型;假如有一個(gè)操作數(shù)是double型,計(jì)算結(jié)果就是double型. 下面的程序表明:在表達(dá)式中的每個(gè)值是如何被提升以匹配各自二進(jìn)制運(yùn)算符的第二個(gè)參數(shù): 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); } }
進(jìn)一步看看發(fā)生在下列程序行的類型提升: double result = (f * b) + (i / c) - (d * s); 在第一個(gè)表達(dá)式f*b中,變量b被提升為float類型,該子表達(dá)式的結(jié)果當(dāng)然是float類型. 接下來,在子表達(dá)式i/c中,邊量c被提升為int類型,該子表達(dá)式的結(jié)果當(dāng)然是int類型. 然后,子表達(dá)式d*s中的變量s被提升為double類型,該子表達(dá)式的結(jié)果當(dāng)然是double類型. 最后,考慮三個(gè)中間值,float類型,int類型,和double類型.float類型加int類型的結(jié)果是 float類型,然后float類型減去提升為double類型的double類型,該表達(dá)式的最后結(jié)果是 double類型.