| CHAPTER 5: Conversions and Promotions |
Previous |
Java Language |
Index |
Next |
Numeric promotion is applied to the operands of an arithmetic operator. Numeric promotion contexts allow the use of an identity conversion (S5.1.1) or a widening primitive conversion (S5.1.2).
Numeric promotions are used to convert the operands of a numeric operator to a common type so that an operation can be performed. The two kinds of numeric promotion are unary numeric promotion (S5.6.1) and binary numeric promotion (S5.6.2). The analogous conversions in C are called "the usual unary conversions" and "the usual binary conversions."
Numeric promotion is not a general feature of Java, but rather a property of the specific definitions of the built-in operations.
Some operators apply unary numeric promotion to a single operand, which must produce a value of a numeric type:
Unary numeric promotion is performed on expressions in the following situations:
Here is a test program that includes examples of unary numeric promotion:
class Test {
public static void main(String[] args) {
byte b = 2;
int a[] = new int[b]; // dimension expression promotion
char c = '\u0001';
a[c] = 1; // index expression promotion
a[0] = -c; // unary - promotion
System.out.println("a: " + a[0] + "," + a[1]);
b = -1;
int i = ~b; // bitwise complement promotion
System.out.println("~0x" + Integer.toHexString(b)
+ "==0x" + Integer.toHexString(i));
i = b << 4L; // shift promotion (left operand)
System.out.println("0x" + Integer.toHexString(b)
+ "<<4L==0x" + Integer.toHexString(i));
}
}
This test program produces the output:
a: -1,1 ~0xffffffff==0x0 0xffffffff<<4L==0xfffffff0
When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value of a numeric type, the following rules apply, in order, using widening conversion (S5.1.2) to convert operands as necessary:
Binary numeric promotion is performed on the operands of certain operators:
An example of binary numeric promotion appears above in S5.1. Here is another:
class Test {
public static void main(String[] args) {
int i = 0;
float f = 1.0f;
double d = 2.0;
// First i*f promoted to float*float, then
// float==double is promoted to double==double:
if (i * f == d)
System.out.println("oops");
// A char&byte is promoted to int&int:
byte b = 0x1f;
char c = 'G';
int control = c & b;
System.out.println(Integer.toHexString(control));
// A int:float promoted to float:float:
f = (b==0) ? f : 4.0f;
System.out.println(1.0/f);
}
}
which produces the output:
7 0.25
The example converts the ASCII character G
to the ASCII control-G (BEL), by masking off all but the low 5 bits of the character. The 7
is the numeric value of this control character.
| © 1996 Sun Microsystems, Inc. All rights reserved. |