Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Promotion in Java?

Tags:

java

The rules for promotion is "when operands are of different types, automatic binary numeric promotion occurs with the smaller operand type being converted to the larger". But the operands are of same type for example,

byte=byte+byte // Compile time error... found int.. 

So why is it so?

like image 757
i2ijeya Avatar asked Nov 02 '09 11:11

i2ijeya


People also ask

Why do we use promotion in Java?

The name Type Promotion specifies that a small size datatype can be promoted to a large size datatype. i.e., an Integer data type can be promoted to long, float, double, etc. This Automatic Type Promotion is done when any method which accepts a higher size data type argument is called with the smaller data type.

What is type promotion?

Type promotion in C is a method to convert any variable from one datatype to another. C allows variables of different datatypes to be present in a single expression. There are different types of type conversions available in C. They are Implicit type conversion and Explicit type conversion.

What is numeric promotion in Java?

Numeric promotion is the conversion of a smaller numeric type to a larger numeric type, so that integer and floating-point operations may take place. In numerical promotion, byte, char, and short values are converted to int values. The int values are also converted to long values, if necessary.

Can int be promoted to Long Java?

We can convert int to long in java using assignment operator. There is nothing to do extra because lower type can be converted to higher type implicitly. It is also known as implicit type casting or type promotion.


2 Answers

There's no + operator for byte. Instead, both operands are promoted to int, so you've got

byte = byte + byte ... becomes (widening to find + operator) ... byte = int + int ... becomes (result of + operator) ... byte = int  

... which then fails because there's no implicit conversion from int to byte. You need to cast:

byte a = 1; byte b = 2;  byte c = (byte) (a + b); 

Here are the actual rules for numeric promotion, from section 5.6.2 of the JLS:


When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order, using widening conversion (§5.1.2) to convert operands as necessary:

  • If any of the operands is of a reference type, unboxing conversion (§5.1.8) is performed. Then:
  • If either operand is of type double, the other is converted to double.
  • Otherwise, if either operand is of type float, the other is converted to float.
  • Otherwise, if either operand is of type long, the other is converted to long.
  • Otherwise, both operands are converted to type int.
like image 105
Jon Skeet Avatar answered Sep 24 '22 14:09

Jon Skeet


You were provided with correct answer about automatic promotion to 'int'.

There is one more note about that - compound assignment operators behave as they have an implicit type case. Example:

byte b1 = 1; byte b2 = 2; b1 = b1 + b2; // compilation fails b1 += b2; // compilation successful 
like image 34
denis.zhdanov Avatar answered Sep 22 '22 14:09

denis.zhdanov