1. Pengetikan

Typecasting di Jawa

Variabel tipe primitif (dengan pengecualian tipe boolean) digunakan untuk menyimpan berbagai jenis angka. Meskipun jenis variabel tidak pernah berubah, ada tempat di mana Anda dapat mengonversi dari satu jenis ke jenis lainnya. Dan tempat itu adalah penugasan .

Variabel dari tipe yang berbeda dapat ditugaskan satu sama lain. Saat Anda melakukan ini, nilai variabel dari satu jenis diubah menjadi nilai dari jenis lain dan ditetapkan ke variabel kedua. Dalam hal ini, kita dapat mengidentifikasi dua jenis konversi tipe: pelebaran dan penyempitan.

Pelebaran seperti memindahkan nilai dari keranjang kecil ke keranjang besar: operasi ini lancar dan tidak menyakitkan. Penyempitan terjadi saat Anda memindahkan nilai dari keranjang besar ke keranjang kecil: mungkin tidak ada cukup ruang, dan Anda harus membuang sesuatu.

Berikut jenisnya, diurutkan berdasarkan ukuran keranjang:

Typecasting di Java 2


2. Konversi tipe pelebaran

Seringkali diperlukan untuk menetapkan variabel dari satu tipe numerik ke variabel tipe numerik lainnya. Bagaimana kamu melakukannya?

Java memiliki 4 tipe integer:

Jenis Ukuran
byte 1 byte
short 2 bytes
int 4 bytes
long 8 bytes

Variabel yang disimpan di keranjang yang lebih kecil selalu dapat ditugaskan ke variabel yang disimpan di keranjang yang lebih besar.

int, shortdan bytevariabel dapat dengan mudah ditugaskan ke longvariabel. shortdan bytevariabel dapat ditugaskan ke intvariabel. Dan bytevariabel dapat ditugaskan ke shortvariabel.

Contoh:

Kode Keterangan
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
Kode ini akan dikompilasi dengan baik.

Konversi seperti itu, dari tipe yang lebih kecil ke tipe yang lebih besar, disebut konversi tipe pelebaran .

Bagaimana dengan bilangan real?

Dengan mereka, semuanya sama — ukuran penting:

Jenis Ukuran
float 4 bytes
double 8 bytes

floatvariabel dapat ditugaskan ke doublevariabel tanpa masalah. Tetapi hal-hal yang lebih menarik dengan tipe integer.

Anda dapat menugaskan variabel bilangan bulat apa pun ke suatu floatvariabel. Bahkan longtipenya, yang panjangnya 8 byte. Dan Anda dapat menetapkan apa pun yang Anda inginkan — variabel atau floatvariabel bilangan bulat apa pun — ke sebuah doublevariabel:

Kode Catatan
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

Perhatikan bahwa mengonversi ke tipe nyata dapat mengakibatkan hilangnya presisi karena kurangnya digit signifikan yang memadai.

Saat mengonversi dari bilangan bulat ke angka titik-mengambang, bagian angka urutan yang lebih rendah dapat dibuang. Tetapi karena bilangan pecahan dipahami untuk menyimpan nilai perkiraan, operasi penugasan semacam itu diizinkan.


3. Mempersempit konversi tipe

Bagaimana dengan kemungkinan lainnya? Bagaimana jika Anda perlu menetapkan longnilai ke intvariabel?

Bayangkan variabel sebagai keranjang. Kami memiliki keranjang dengan berbagai ukuran: 1, 2, 4 dan 8 byte. Tidak masalah memindahkan apel dari keranjang yang lebih kecil ke keranjang yang lebih besar. Namun saat berpindah dari keranjang yang lebih besar ke keranjang yang lebih kecil, sebagian apel mungkin hilang.

Transformasi ini — dari tipe yang lebih besar ke tipe yang lebih kecil — disebut konversi tipe penyempitan . Saat melakukan operasi penugasan seperti ini, bagian dari angka mungkin tidak cocok dengan variabel baru dan oleh karena itu dapat dibuang.

Saat mempersempit tipe, kita harus secara eksplisit memberi tahu kompiler bahwa kita tidak membuat kesalahan, bahwa kita sengaja membuang sebagian dari angka tersebut. Operator typecast digunakan untuk ini. Ini adalah nama tipe dalam tanda kurung .

Dalam situasi seperti itu, kompiler Java mengharuskan pemrogram untuk menentukan operator typecast. Secara umum, tampilannya seperti ini:

(type) expression

Contoh:

Kode Keterangan
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
Setiap kali operator typecast harus ditunjukkan secara eksplisit

Ini asama dengan 1, dan mungkin operator typecast sepertinya berlebihan. Tapi bagaimana jika alebih besar?

Kode Keterangan
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

Satu juta sangat cocok dengan a longdan menjadi int. Namun saat menetapkan satu juta ke shortvariabel, dua byte pertama dibuang, dan hanya dua byte terakhir yang dipertahankan. Dan saat menugaskan ke a byte, satu-satunya yang tersisa adalah byte terakhir.

Bagaimana angka disusun dalam memori:

Jenis Notasi biner Notasi desimal
int 0b 00000000 00001111 01000010 01000000 1000000
short 0b 01000010 01000000 16.960
byte 0b 01000000 64

charjenis

A char, seperti a short, menempati dua byte, tetapi untuk mengonversi satu ke yang lain, Anda selalu perlu menggunakan operator typecast. Masalahnya di sini adalah bahwa shorttipenya ditandatangani dan dapat berisi nilai dari -32,768to +32,767, tetapi chartipenya tidak ditandatangani dan dapat berisi nilai dari 0to 65,535.

Bilangan negatif tidak dapat disimpan dalam a char, tetapi dapat disimpan dalam a short. Dan a shorttidak dapat menyimpan angka yang lebih besar dari 32,767, tetapi angka tersebut dapat disimpan dalam char.


4. Jenis ekspresi

Bagaimana jika variabel dari tipe yang berbeda digunakan dalam ekspresi yang sama? Logikanya, kami memahami bahwa mereka pertama-tama perlu dikonversi ke tipe umum. Tapi yang mana?

Untuk yang lebih besar, tentu saja.

Java selalu mengonversi ke tipe yang lebih besar. Secara kasar, salah satu tipe diperlebar terlebih dahulu dan baru kemudian operasi dilakukan dengan menggunakan nilai dari tipe yang sama.

Jika an intdan a longterlibat dalam ekspresi, nilai dari intakan dikonversi menjadi a longdan baru kemudian operasi akan dilanjutkan:

Kode Keterangan
int a = 1;
long b = 2;
long c = a + b;
aakan diperlebar menjadi a longdan kemudian penambahan akan terjadi.

Angka titik-mengambang

Jika bilangan bulat dan bilangan titik-mengambang ( floatatau double) terlibat dalam ekspresi, bilangan bulat akan diubah menjadi bilangan titik-mengambang ( floatatau double), dan baru setelah itu operasi akan dilakukan.

Jika operasi melibatkan a floatdan a double, maka floatakan diubah menjadi a double. Yang sebenarnya diharapkan.

Kejutan

Jenis byte, short, dan charselalu dikonversi menjadi intsaat berinteraksi satu sama lain. Ada alasan bagus mengapa inttipe ini dianggap sebagai tipe bilangan bulat standar.

Jika Anda mengalikan a bytedengan a short, Anda mendapatkan int. Jika Anda mengalikan a bytedengan a byte, Anda mendapatkan int. Bahkan jika Anda menambahkan a bytedan a byte, Anda mendapatkan int.

Ada beberapa alasan untuk ini. Contoh:

Kode Keterangan
byte a = 110;
byte b = 120;
byte c = a * b;  // Error
110 * 120is 13,200, yang sedikit lebih besar dari nilai maksimum jenisnya byte:127
byte a = 110;
byte b = 120;
byte c = a + b; // Error
110 + 120is 230, yang juga sedikit lebih besar dari nilai maksimum jenisnya byte:127

Secara umum, saat mengalikan angka 8-bit (1 byte) dengan angka 8-bit (1 byte), kita mendapatkan angka yang menempati bit 16-bit (2 byte)

Akibatnya, semua operasi dengan tipe bilangan bulat yang lebih kecil dari intselalu segera diubah menjadi ints. Dan itu berarti bahwa jika Anda ingin menyimpan hasil perhitungan dalam variabel dengan tipe yang lebih kecil dari int, maka Anda harus selalu menentukan operator typecast secara eksplisit.

Contoh:

Kode Keterangan
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
Ekspresi byte * byteakan menjadiint
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
Ekspresi byte + byteakan menjadiint
byte a = 1;
byte b = (byte) (a + 1);
Ekspresi byte + intakan menjadi int
Yang literal adalah int.

5. Nuansa penting

Operator typecast memiliki prioritas yang cukup tinggi.

Artinya, jika ekspresi berisi, misalnya, penambahan dan operator typecast, typecast akan dilakukan sebelum penambahan.

Contoh:

Kode Keterangan
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
Operator typecast hanya akan diterapkan ke avariabel, yang sudah menjadi byte. Kode ini tidak akan dikompilasi.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
Ini adalah cara yang benar.

Jika Anda ingin mengonversi seluruh ekspresi menjadi tipe tertentu, dan bukan hanya satu komponen ekspresi, maka bungkus seluruh ekspresi dalam tanda kurung dan letakkan operator typecast di depan.