Reputation: 61
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
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
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
tofloat
is governed by the IEEE 754 rounding rules (§4.2.4). This conversion can lose precision, but also lose range, resulting in afloat
zero from a nonzerodouble
and afloat
infinity from a finite double. Adouble
NaN is converted to afloat
NaN and adouble
infinity is converted to the same-signedfloat
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