1. Typecasting
Pembolehubah jenis primitif (dengan pengecualian jenis boolean
) digunakan untuk menyimpan pelbagai jenis nombor. Walaupun jenis pembolehubah tidak pernah berubah, terdapat tempat di mana anda boleh menukar dari satu jenis ke yang lain. Dan tempat itu adalah tugasan .
Pembolehubah pelbagai jenis boleh ditugaskan antara satu sama lain. Apabila anda melakukan ini, nilai pembolehubah satu jenis ditukar kepada nilai jenis lain dan diberikan kepada pembolehubah kedua. Dalam hal ini, kita boleh mengenal pasti dua jenis penukaran jenis: pelebaran dan penyempitan.
Pelebaran adalah seperti memindahkan nilai dari bakul kecil kepada bakul besar: operasi ini lancar dan tidak menyakitkan. Penyempitan berlaku apabila anda mengalihkan nilai dari bakul besar ke bakul kecil: mungkin tidak ada ruang yang mencukupi, dan anda perlu membuang sesuatu.
Berikut ialah jenis, diisih mengikut saiz bakul:
2. Meluaskan penukaran jenis
Selalunya perlu untuk menetapkan pembolehubah satu jenis angka kepada pembolehubah jenis angka yang lain. Bagaimana anda melakukannya?
Java mempunyai 4 jenis integer:
taip | Saiz |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
Pembolehubah yang disimpan dalam bakul yang lebih kecil sentiasa boleh diberikan kepada pembolehubah yang disimpan dalam bakul yang lebih besar.
int
, short
dan byte
pembolehubah boleh diberikan dengan mudah kepada long
pembolehubah. short
dan byte
pembolehubah boleh diberikan kepada int
pembolehubah. Dan byte
pembolehubah boleh diberikan kepada short
pembolehubah.
Contoh:
Kod | Penerangan |
---|---|
|
Kod ini akan disusun dengan baik. |
Penukaran sedemikian, daripada jenis yang lebih kecil kepada yang lebih besar, dipanggil penukaran jenis pelebaran .
Bagaimana dengan nombor nyata?
Dengan mereka, semuanya adalah sama — saiz penting:
taip | Saiz |
---|---|
float |
4 bytes |
double |
8 bytes |
float
pembolehubah boleh diberikan kepada double
pembolehubah tanpa sebarang masalah. Tetapi perkara lebih menarik dengan jenis integer.
Anda boleh menetapkan sebarang pembolehubah integer kepada float
pembolehubah. Malah long
jenis, yang panjangnya 8 bait. Dan anda boleh menetapkan apa sahaja yang anda mahu - mana-mana pembolehubah integer atau float
pembolehubah - kepada double
pembolehubah:
Kod | Catatan |
---|---|
|
|
Ambil perhatian bahawa menukar kepada jenis sebenar boleh mengakibatkan kehilangan ketepatan kerana kekurangan digit bererti yang mencukupi.
Apabila menukar daripada integer kepada nombor titik terapung, bahagian nombor tertib bawah mungkin dibuang. Tetapi oleh kerana nombor pecahan difahami untuk menyimpan nilai anggaran, operasi tugasan tersebut dibenarkan.
3. Menyempitkan penukaran jenis
Bagaimana pula dengan kemungkinan lain? Bagaimana jika anda perlu memberikan long
nilai kepada int
pembolehubah?
Bayangkan pembolehubah sebagai bakul. Kami mempunyai bakul pelbagai saiz: 1, 2, 4 dan 8 bait. Tidak menjadi masalah untuk memindahkan epal dari bakul yang lebih kecil kepada yang lebih besar. Tetapi apabila beralih dari bakul yang lebih besar kepada yang lebih kecil, beberapa epal mungkin hilang.
Transformasi ini — daripada jenis yang lebih besar kepada jenis yang lebih kecil — dipanggil penukaran jenis penyempitan . Apabila melakukan operasi tugasan seperti ini, sebahagian daripada nombor mungkin tidak sesuai dengan pembolehubah baharu dan oleh itu boleh dibuang.
Apabila menyempitkan jenis, kita mesti secara jelas memberitahu pengkompil bahawa kita tidak membuat kesilapan, bahawa kita sengaja membuang sebahagian daripada nombor itu. Operator typecast digunakan untuk ini. Ia adalah nama jenis dalam kurungan .
Dalam situasi sedemikian, pengkompil Java memerlukan pengaturcara untuk menentukan pengendali taip. Secara umum, ia kelihatan seperti ini:
(type) expression
Contoh:
Kod | Penerangan |
---|---|
|
Setiap kali pengendali taip mesti ditunjukkan dengan jelas |
Di sini a
adalah sama dengan 1
, dan mungkin pengendali taip kelihatan seperti berlebihan. Tetapi bagaimana jika a
lebih besar?
Kod | Penerangan |
---|---|
|
|
Satu juta sesuai dengan sempurna ke dalam long
dan ke dalam int
. Tetapi apabila memperuntukkan satu juta kepada short
pembolehubah, dua bait pertama akan dibuang, dan hanya dua bait terakhir dikekalkan. Dan apabila menetapkan kepada byte
, satu-satunya perkara yang tinggal ialah bait terakhir.
Bagaimana nombor disusun dalam ingatan:
taip | tatatanda binari | tatatanda perpuluhan |
---|---|---|
int |
0b 00000000 00001111 01000010 01000000 | 1000000 |
short |
0b 01000010 01000000 | 16.960 |
byte |
0b 01000000 | 64 |
char
taip
A char
, seperti a short
, menduduki dua bait, tetapi untuk menukar satu kepada yang lain, anda sentiasa perlu menggunakan operator taip. Isu di sini ialah short
jenis ditandatangani dan boleh mengandungi nilai dari -32,768
kepada +32,767
, tetapi char
jenis itu tidak ditandatangani dan boleh mengandungi nilai dari 0
kepada 65,535
.
Nombor negatif tidak boleh disimpan dalam char
, tetapi ia boleh disimpan dalam short
. Dan a short
tidak boleh menyimpan nombor yang lebih besar daripada 32,767
, tetapi nombor tersebut boleh disimpan dalam char
.
4. Jenis ungkapan
Bagaimana jika pembolehubah jenis yang berbeza digunakan dalam ungkapan yang sama? Secara logiknya, kami faham bahawa mereka perlu ditukar kepada jenis biasa dahulu. Tetapi yang mana satu?
Kepada yang lebih besar, sudah tentu.
Java sentiasa menukar kepada jenis yang lebih besar. Secara kasarnya, salah satu jenis mula-mula diluaskan dan barulah operasi dilakukan menggunakan nilai-nilai jenis yang sama.
Jika an int
dan a long
terlibat dalam ungkapan, nilai int
akan ditukar kepada a long
dan hanya selepas itu operasi akan diteruskan:
Kod | Penerangan |
---|---|
|
a akan dilebarkan kepada a long dan kemudian penambahan akan berlaku. |
Nombor titik terapung
Jika integer dan nombor titik terapung ( float
atau double
) terlibat dalam ungkapan, integer akan ditukar kepada nombor titik terapung ( float
atau double
), dan selepas itu barulah operasi dijalankan.
Jika operasi melibatkan a float
dan a double
, maka float
akan ditukar kepada a double
. Yang sebenarnya dijangka.
, , dan jenis sentiasa ditukar kepada apabila byte
berinteraksi antara satu sama lain. Terdapat sebab yang baik mengapa jenis itu dianggap sebagai jenis integer standard.short
char
int
int
Jika anda mendarab a byte
dengan a short
, anda mendapat int
. Jika anda mendarab a byte
dengan a byte
, anda mendapat int
. Walaupun anda menambah a byte
dan a byte
, anda mendapat int
.
Terdapat beberapa sebab untuk ini. Contoh:
Kod | Penerangan |
---|---|
|
110 * 120 ialah 13,200 , yang lebih besar sedikit daripada nilai maksimum jenis byte :127 |
|
110 + 120 ialah 230 , yang juga lebih besar sedikit daripada nilai maksimum jenis byte :127 |
Secara umum, apabila mendarabkan nombor 8-bit (1 bait) dengan nombor 8-bit (1 bait), kita mendapat nombor yang menduduki 16-bit bit (2 bait)
Akibatnya, semua operasi dengan jenis integer yang lebih kecil daripada int
sentiasa ditukar dengan serta-merta kepada int
s. Dan ini bermakna jika anda ingin menyimpan hasil pengiraan dalam pembolehubah jenis yang lebih kecil daripada int
, maka anda akan sentiasa perlu menyatakan secara eksplisit pengendali taip.
Contoh:
Kod | Penerangan |
---|---|
|
Ungkapan itu byte * byte akan menjadiint |
|
Ungkapan itu byte + byte akan menjadiint |
|
Ungkapan itu byte + int akan menjadi int Yang tersurat ialah int . |
5. Nuansa penting
Pengendali taip mempunyai keutamaan yang agak tinggi.
Ini bermakna jika ungkapan mengandungi, contohnya, penambahan dan pengendali taip, siaran taip akan dilakukan sebelum penambahan.
Contoh:
Kod | Penerangan |
---|---|
|
Operator typecast hanya akan digunakan pada a pembolehubah, yang sudah menjadi byte . Kod ini tidak akan disusun. |
|
Ini adalah cara yang betul. |
Jika anda ingin menukar keseluruhan ungkapan kepada jenis tertentu, dan bukan hanya satu komponen ungkapan, kemudian bungkus keseluruhan ungkapan dalam kurungan dan letakkan operator taip di hadapan.
GO TO FULL VERSION