27 Mart 2017 Pazartesi

Narrowing Primitive Conversion

long'tan int'e
Açıklaması şöyle
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.
Açıklaması şöyle
the rule for converting a long that's too big for the int is to apply the wrap-around rule into the destination type. (Under the hood, the significant bits from the source type are simply discarded.)
Şöyle yaparız.
System.out.println((int) 2147483648l);
Çıktı olarak şunu alırız.
-2147483648
long 8 byte uzunluğundadır ve şu şekildedir.
00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
int'e çevirirken en son 4 byte alınır. Bu da eksi bir sayıdır.
10000000 00000000 00000000 00000000
float'tan int'e
Açıklaması şöyle
...if the floating-point number is not an infinity, the floating-point value is rounded to an integer value V, rounding toward zero using IEEE 754 round-toward-zero mode (§4.2.3).
...[if] the value [is] too large (a positive value of large magnitude or positive infinity), [then] the result of the first step is the largest representable value of type int or long.
Açıklaması şöyle
The rule for converting a float that's too big for the destination type is to take the largest possible for the destination type.
Şöyle yaparız.
System.out.println((int) 2147483648f);
Çıktı olarak şunu alırız. float 2147483648 değerine yuvarlanır ancak bu değer int'e sığmaz. int'e sığan en büyük değer alınır.
2147483647
final değişkenler
final değişkenler promotion'a uğrasa bile narrowing ile aynı tipe atanabilir. Açıklaması şöyle
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.
Şu kod derlenmez.
byte foo = 1;
byte fooFoo = foo + foo;
Çıktı olarak şunu alırız.
Error:(5, 27) java: incompatible types: possible lossy conversion from int to byte
Şu kod final değişkenlere narrowing uygulandığı için derlenir.
final byte foo = 1;
final byte fooFoo = foo + foo;



Hiç yorum yok:

Yorum Gönder