1. Pengetikan
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:
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
, short
dan byte
variabel dapat dengan mudah ditugaskan ke long
variabel. short
dan byte
variabel dapat ditugaskan ke int
variabel. Dan byte
variabel dapat ditugaskan ke short
variabel.
Contoh:
Kode | Keterangan |
---|---|
|
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 |
float
variabel dapat ditugaskan ke double
variabel tanpa masalah. Tetapi hal-hal yang lebih menarik dengan tipe integer.
Anda dapat menugaskan variabel bilangan bulat apa pun ke suatu float
variabel. Bahkan long
tipenya, yang panjangnya 8 byte. Dan Anda dapat menetapkan apa pun yang Anda inginkan — variabel atau float
variabel bilangan bulat apa pun — ke sebuah double
variabel:
Kode | Catatan |
---|---|
|
|
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 long
nilai ke int
variabel?
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 |
---|---|
|
Setiap kali operator typecast harus ditunjukkan secara eksplisit |
Ini a
sama dengan 1
, dan mungkin operator typecast sepertinya berlebihan. Tapi bagaimana jika a
lebih besar?
Kode | Keterangan |
---|---|
|
|
Satu juta sangat cocok dengan a long
dan menjadi int
. Namun saat menetapkan satu juta ke short
variabel, 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 |
char
jenis
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 short
tipenya ditandatangani dan dapat berisi nilai dari -32,768
to +32,767
, tetapi char
tipenya tidak ditandatangani dan dapat berisi nilai dari 0
to 65,535
.
Bilangan negatif tidak dapat disimpan dalam a char
, tetapi dapat disimpan dalam a short
. Dan a short
tidak 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 int
dan a long
terlibat dalam ekspresi, nilai dari int
akan dikonversi menjadi a long
dan baru kemudian operasi akan dilanjutkan:
Kode | Keterangan |
---|---|
|
a akan diperlebar menjadi a long dan kemudian penambahan akan terjadi. |
Angka titik-mengambang
Jika bilangan bulat dan bilangan titik-mengambang ( float
atau double
) terlibat dalam ekspresi, bilangan bulat akan diubah menjadi bilangan titik-mengambang ( float
atau double
), dan baru setelah itu operasi akan dilakukan.
Jika operasi melibatkan a float
dan a double
, maka float
akan diubah menjadi a double
. Yang sebenarnya diharapkan.
Jenis byte
, short
, dan char
selalu dikonversi menjadi int
saat berinteraksi satu sama lain. Ada alasan bagus mengapa int
tipe ini dianggap sebagai tipe bilangan bulat standar.
Jika Anda mengalikan a byte
dengan a short
, Anda mendapatkan int
. Jika Anda mengalikan a byte
dengan a byte
, Anda mendapatkan int
. Bahkan jika Anda menambahkan a byte
dan a byte
, Anda mendapatkan int
.
Ada beberapa alasan untuk ini. Contoh:
Kode | Keterangan |
---|---|
|
110 * 120 is 13,200 , yang sedikit lebih besar dari nilai maksimum jenisnya byte :127 |
|
110 + 120 is 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 int
selalu segera diubah menjadi int
s. 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 |
---|---|
|
Ekspresi byte * byte akan menjadiint |
|
Ekspresi byte + byte akan menjadiint |
|
Ekspresi byte + int akan 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 |
---|---|
|
Operator typecast hanya akan diterapkan ke a variabel, yang sudah menjadi byte . Kode ini tidak akan dikompilasi. |
|
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.
GO TO FULL VERSION