Konversi Primitif Java

1. Perkenalan

Java adalah bahasa yang diketik artinya menggunakan konsep tipe. Ada dua jenis kelompok yang berbeda:

  1. tipe data primitif
  2. tipe data abstrak.

Pada artikel ini, kami akan fokus pada konversi tipe primitif.

2. Sekilas tentang Primitif

Hal pertama yang harus kita ketahui adalah jenis nilai apa yang dapat digunakan dengan tipe primitif. Ada delapan tipe primitif yaitu:

  • byte - 8 bit dan ditandatangani

  • pendek - 16 bit dan ditandatangani

  • char - 16 bit dan unsigned, sehingga dapat mewakili karakter Unicode

  • int - 32 bit dan ditandatangani

  • panjang - 64 bit dan ditandatangani

  • float - 32 bit dan ditandatangani

  • ganda - 64 bit dan ditandatangani

  • boolean - ini bukan numerik, hanya boleh memilikinilai benar atau salah

Ini tidak dimaksudkan untuk menjadi diskusi ekstensif tentang primitif dan kami akan berbicara sedikit lebih banyak tentang detailnya sesuai kebutuhan selama konversi.

3. Memperlebar Konversi Primitif

Saat kita perlu mengonversi dari primitif yang lebih sederhana atau lebih kecil dari tipe tujuan, kita tidak perlu menggunakan notasi khusus untuk itu:

int myInt = 127; long myLong = myInt;

Selama konversi pelebaran, nilai primitif yang lebih kecil ditempatkan di atas wadah yang lebih besar, yang berarti bahwa semua ruang ekstra, di sebelah kiri nilai, diisi dengan nol. Ini juga dapat digunakan untuk beralih dari grup integer ke floating point:

float myFloat = myLong; double myDouble = myLong;

Hal ini dimungkinkan karena perpindahan ke primitif yang lebih luas tidak kehilangan informasi apapun.

4. Mempersempit Konversi Primitif

Terkadang kita perlu memasukkan nilai yang lebih besar dari tipe yang digunakan dalam deklarasi variabel. Hal ini dapat mengakibatkan hilangnya informasi karena beberapa byte harus dibuang.

Dalam hal ini, kami harus secara eksplisit menyatakan bahwa kami menyadari situasinya dan kami setuju dengan itu, dengan menggunakan pemeran:

int myInt = (int) myDouble; byte myByte = (byte) myInt;

5. Memperluas dan Mempersempit Konversi Primitif

Situasi ini terjadi dalam kasus yang sangat spesifik ketika kita ingin mengonversi dari byte menjadi char . Konversi pertama adalah pelebaran byte menjadi int dan kemudian dari int dipersempit menjadi char .

Sebuah contoh akan memperjelas hal ini:

byte myLargeValueByte = (byte) 130; //0b10000010 -126

Representasi biner 130 adalah sama untuk -126, perbedaannya adalah interpretasi bit sinyal. Sekarang mari kita ubah dari byte menjadi char :

char myLargeValueChar = (char) myLargeValueByte; //0b11111111 10000010 unsigned value int myLargeValueInt = myLargeValueChar; //0b11111111 10000010 65410

The Char representasi adalah nilai Unicode, tetapi mengkonversi ke int menunjukkan kita nilai yang sangat besar yang memiliki 8 bit rendah persis sama dengan -126.

Jika kita mengubahnya lagi menjadi byte, kita mendapatkan:

byte myOtherByte = (byte) myLargeValueInt; //0b10000010 -126

Nilai asli yang kami gunakan. Jika seluruh kode dimulai dengan karakter , nilainya akan berbeda:

char myLargeValueChar2 = 130; //This is an int not a byte! //0b 00000000 10000010 unsigned value int myLargeValueInt2 = myLargeValueChar2; //0b00000000 10000010 130 byte myOtherByte2 = (byte) myLargeValueInt2; //0b10000010 -126

Meskipun representasi byte sama, yaitu -126, representasi char memberi kita dua karakter berbeda.

6. Konversi Tinju / Unboxing

Di Java, kami memiliki Kelas Pembungkus untuk setiap jenis primitif, ini adalah cara cerdas dalam menyediakan pemrogram metode pemrosesan yang berguna, tanpa biaya tambahan untuk menjadikan semuanya sebagai referensi objek kelas berat. Sejak Java 1.5 kemampuan untuk secara otomatis mengonversi ke / dari primitif ke objek dan kembali disertakan dan dicapai dengan atribusi sederhana:

Integer myIntegerReference = myInt; int myOtherInt = myIntegerReference;

7. Konversi String

Semua tipe primitif dapat diubah menjadi String melalui Kelas Pembungkusnya, yang menggantikan metode toString () :

String myString = myIntegerReference.toString();

Jika kita perlu kembali ke tipe primitif, kita perlu menggunakan metode parse yang ditentukan oleh Kelas Wrapper yang sesuai:

byte myNewByte = Byte.parseByte(myString); short myNewShort = Short.parseShort(myString); int myNewInt = Integer.parseInt(myString); long myNewLong = Long.parseLong(myString); float myNewFloat = Float.parseFloat(myString); double myNewDouble = Double.parseDouble(myString); 
boolean myNewBoolean = Boolean.parseBoolean(myString);

The only exception here is the Character Class because a String is made of chars anyway, this way, considering that probably the String is made of a single char, we can use the charAt() method of the String class:

char myNewChar = myString.charAt(0);

8. Numeric Promotions

To execute a binary operation, it is necessary that both operands are compatible in terms of size.

There is a set of simple rules that apply:

  1. If one of the operands is a double, the other is promoted to double
  2. Otherwise, if one of the operands is a float, the other is promoted to float
  3. Sebaliknya, jika salah satu operan panjang , yang lain dipromosikan menjadi panjang
  4. Jika tidak, keduanya dianggap int

Mari kita lihat contohnya:

byte op1 = 4; byte op2 = 5; byte myResultingByte = (byte) (op1 + op2);

Kedua operan dipromosikan menjadi int dan hasilnya harus diturunkan ke byte lagi.

9. Kesimpulan

Konversi antar tipe adalah tugas yang sangat umum pada aktivitas pemrograman harian. Ada sekumpulan aturan yang mengatur cara bahasa yang diketik secara statis mengoperasikan konversi tersebut. Mengetahui aturan ini dapat menghemat banyak waktu saat mencoba mencari tahu mengapa kode tertentu dikompilasi atau tidak.

Kode yang digunakan dalam artikel ini dapat ditemukan di GitHub.