除了將byt型和short型提升到int型以外,java定義了若干適用于表達(dá)式的類(lèi)型提升規(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ā)生在下列程序行的類(lèi)型提升:

  double result = (f * b) + (i / c) - (d * s);

  在第一個(gè)表達(dá)式f*b中,變量b被提升為float類(lèi)型,該子表達(dá)式的結(jié)果當(dāng)然是float類(lèi)型。接下來(lái),在子表達(dá)式i/c中,邊量c被提升為int類(lèi)型,該子表達(dá)式的結(jié)果當(dāng)然是int類(lèi)型。然后,子表達(dá)式d*s中的變量s被提升為double類(lèi)型,該子表達(dá)式的結(jié)果當(dāng)然是double類(lèi)型。最后,考慮三個(gè)中間值,float類(lèi)型,int類(lèi)型,和double類(lèi)型.float類(lèi)型加int類(lèi)型的結(jié)果是float類(lèi)型,然后float類(lèi)型減去提升為double類(lèi)型的double類(lèi)型,該表達(dá)式的最后結(jié)果是double類(lèi)型。