Crasher Hacs
Crasher Hacs

Reputation: 61

Java implicit conversion

With the following code:

Float a = 1.2;

there is an error because it takes the decimal as double value and double is a bigger datatype than float.

Now, it takes integer as default int type. So, why is the following code not giving any error?

Byte b = 20;

Upvotes: 6

Views: 389

Answers (2)

Joni
Joni

Reputation: 111269

There are no implicit narrowing conversions in general - constant expressions are the only exception, and they are explicitly allowed by JLS 5.2:

In addition, if the expression is a constant expression (§15.28) of type byte, short, char, or int:

* A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.

There is no mention of implicit narrowing conversions being allowed for floating point numbers, so they are forbidden as per the general rule.

Upvotes: 1

Ted Hopp
Ted Hopp

Reputation: 234807

The compiler is smart enough to figure out that the bit representation of 20 (an int value) can fit into a byte with no loss of data. From the Java Language Specification §5.1.3:

A narrowing primitive conversion from double to float is governed by the IEEE 754 rounding rules (§4.2.4). This conversion can lose precision, but also lose range, resulting in a float zero from a nonzero double and a float infinity from a finite double. A double NaN is converted to a float NaN and a double infinity is converted to the same-signed float infinity.

A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.

See also this thread.

Upvotes: 7

Related Questions