JavaRush /Java Blog /Random-ID /Mentransmisikan (mengonversi) tipe primitif di Java

Mentransmisikan (mengonversi) tipe primitif di Java

Dipublikasikan di grup Random-ID
Halo! Saat menelusuri JavaRush, Anda menemukan tipe primitif lebih dari sekali. Berikut daftar singkat apa yang kami ketahui tentang mereka:
  1. Mereka bukan objek dan mewakili nilai yang disimpan dalam memori
  2. Ada beberapa jenis tipe primitif:
    • Bilangan bulat - byte, short, int,long
    • Angka floating point (pecahan) - floatdandouble
    • Boolean -boolean
    • Simbolis (untuk menunjukkan huruf dan angka) -char
  3. Masing-masing dari mereka memiliki rentang nilainya sendiri:
Tipe primitif Ukuran dalam memori Jarak nilai
byte 8 sedikit -128 hingga 127
pendek 16 sedikit ke -32768 hingga 32767
arang 16 sedikit dari 0 hingga 65536
ke dalam 32 bit dari -2147483648 hingga 2147483647
panjang 64 bit dari -9223372036854775808 hingga 9223372036854775807
mengambang 32 bit dari (2 pangkat -149) hingga ((2-2 pangkat -23)*2 pangkat 127)
dobel 64 bit dari (-2 pangkat 63) hingga ((2 pangkat 63) - 1)
boolean 8 (bila digunakan dalam array), 32 (bila digunakan dalam non-array) benar atau salah
Namun, selain nilai, tipe juga berbeda dalam ukuran memori. intmembutuhkan lebih dari byte. A long- lebih dari short. Jumlah memori yang ditempati oleh orang primitif dapat dibandingkan dengan boneka bersarang: Ekspansi dan kontraksi tipe primitif - 2 Ada ruang kosong di dalam boneka bersarang. Semakin besar boneka yang bersarang, semakin banyak ruang. longKita dapat dengan mudah memasukkan yang lebih kecil ke dalam boneka bersarang yang besar int. Ini pas dengan mudah dan Anda tidak perlu melakukan apa pun tambahan. Di Java, ketika bekerja dengan primitif, ini disebut konversi otomatis. Dengan cara lain disebut ekspansi. Berikut ini contoh ekstensi sederhana:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Di sini kita memberikan nilai bytepada suatu variabel int. Penugasan berhasil dan tanpa masalah apa pun: nilai yang disimpan di dalamnya bytemenempati lebih sedikit ruang memori daripada yang “muat” di dalamnya int. “Boneka bersarang kecil” (nilai byte) dengan mudah masuk ke dalam “matryoshka besar” (variabel int). Hal lain adalah ketika Anda mencoba melakukan yang sebaliknya - memasukkan nilai besar ke dalam variabel yang tidak dirancang untuk ukuran tersebut. Pada prinsipnya, trik ini tidak akan berhasil pada boneka bersarang asli, tetapi di Java akan berhasil, tetapi dengan nuansa. Mari kita coba memasukkan nilai intke dalam variabel short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Kesalahan! Kompiler memahami bahwa Anda mencoba melakukan sesuatu yang tidak standar, dan memasukkan boneka matryoshka besar ( int) ke dalam boneka kecil ( short). Kesalahan kompilasi dalam hal ini adalah peringatan dari kompiler: “ Hei, apakah Anda yakin ingin melakukan ini? “Jika Anda yakin, beri tahu kompiler tentang hal itu: “ Semuanya baik-baik saja, saya tahu apa yang saya lakukan!” ” Proses ini disebut konversi tipe eksplisit, atau penyempitan . Untuk mempersempit, Anda perlu secara eksplisit menunjukkan tipe yang ingin Anda berikan nilai. Dengan kata lain, jawablah pertanyaan penyusun: “ Nah, di antara boneka kecil ini, Anda ingin memasukkan boneka besar ini ke dalam boneka yang mana?” ” Dalam kasus kami, tampilannya akan seperti ini:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
Kami secara eksplisit menunjukkan bahwa kami ingin memasukkan nilai intke dalam variabel shortdan bertanggung jawab atasnya. Kompiler, melihat indikasi eksplisit dari tipe yang lebih sempit, melakukan konversi. Apa hasilnya? Output konsol: -27008 Agak tidak terduga. Kenapa persis seperti ini? Ini sebenarnya sederhana. Kami memiliki nilai asli - 10000000 Itu disimpan dalam variabel intyang memakan 32 bit, dan dalam bentuk biner tampilannya seperti ini: Ekspansi dan kontraksi tipe primitif - 3 Kami menulis nilai ini ke variabel short, tetapi hanya dapat menyimpan 16 bit! Oleh karena itu, hanya 16 bit pertama dari nomor kita yang akan dipindahkan ke sana, sisanya akan dibuang. Akibatnya, variabel tersebut shortakan berisi nilai Ekspansi dan kontraksi tipe primitif - 4, yang dalam bentuk desimal sama persis dengan -27008 Itulah sebabnya kompiler “meminta konfirmasi” dalam bentuk pemeran eksplisit ke tipe tertentu. Pertama, ini menunjukkan bahwa Anda bertanggung jawab atas hasilnya, dan kedua, ini memberi tahu kompiler berapa banyak ruang yang harus dialokasikan saat melakukan casting tipe. Lagi pula, jika dalam contoh terakhir kita melakukan cast intke type byte, dan bukan ke short, kita hanya akan memiliki 8 bit, bukan 16 bit, dan hasilnya akan berbeda. Untuk tipe pecahan ( floatdan double), penyempitan terjadi secara berbeda. Jika Anda mencoba mengubah bilangan tersebut menjadi bilangan bulat, bagian pecahannya akan dibuang.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Keluaran konsol: 2

Tipe data karakter

Anda sudah mengetahui bahwa tipe char digunakan untuk menampilkan karakter individual.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
Namun ia memiliki sejumlah fitur yang penting untuk dipahami. Mari kita lihat kembali tabel dengan rentang nilai:
Tipe primitif Ukuran dalam memori Jarak nilai
byte 8 sedikit -128 hingga 127
pendek 16 sedikit -32768 hingga 32767
arang 16 sedikit dari 0 hingga 65536
ke dalam 32 bit dari -2147483648 hingga 2147483647
panjang 64 bit dari -9223372036854775808 hingga 9223372036854775807
mengambang 32 bit dari (2 pangkat -149) hingga ((2-2 pangkat -23)*2 pangkat 127)
dobel 64 bit dari (-2 pangkat 63) hingga ((2 pangkat 63)-1)
boolean 8 (bila digunakan dalam array), 32 (bila digunakan dalam non-array) benar atau salah
Tipe ini charmemiliki rentang numerik dari 0 hingga 65536. Namun apa artinya ini? Bagaimanapun, charini bukan hanya angka, tetapi juga huruf, tanda baca... Faktanya adalah bahwa nilai chardisimpan di Java dalam format Unicode. Kita telah menemukan Unicode di salah satu kuliah sebelumnya. Anda mungkin ingat bahwa Unicode adalah standar pengkodean karakter yang mencakup karakter dari hampir semua bahasa tertulis di dunia. Dengan kata lain, ini adalah daftar kode khusus yang di dalamnya terdapat kode untuk hampir semua karakter dari bahasa apa pun. Tabel Unicode umum sangat besar dan, tentu saja, tidak perlu dihafal. Ini, misalnya, sebagian darinya: Ekspansi dan kontraksi tipe primitif - 5 Hal utama adalah memahami prinsip penyimpanan nilai char, dan ingat bahwa dengan mengetahui kode simbol tertentu, Anda selalu bisa mendapatkannya di program. Mari kita coba ini dengan beberapa nomor acak:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Output konsol: 耰 Ini adalah format penyimpanan karakter di Java char. Setiap karakter berhubungan dengan angka - kode numerik 16 bit, atau dua byte. Unicode 32816 sesuai dengan karakter 耰. Perhatikan momen ini. Dalam contoh ini kami menggunakan variabel int. Ini menempati 32 bit memori , sementara char16 . Di sini kami memilih karena nomor yang kami butuhkan, 32816, berada di luar jangkauan . Meskipun ukurannya , seperti short, adalah 16 bit, tidak ada angka negatif dalam rentang tersebut, sehingga rentang “positif” dua kali lebih besar (65536 bukannya 32767 ). Kita bisa menggunakan , selama kode kita berada dalam kisaran 65536. Namun jika kita membuat angka , itu akan memakan waktu lebih dari 16 bit. Dan ketika mempersempit jenisnya: intshortcharcharcharshortintint >65536
char c = (char) x;
bit tambahan akan dibuang, dan hasilnya akan sangat tidak terduga.

Fitur penambahan char dan bilangan bulat

Mari kita lihat contoh yang tidak biasa ini:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Output konsol: 50 O_O Dimana logikanya? 1+1, dari mana datangnya 50?! Anda telah mengetahui bahwa nilai chardisimpan dalam memori sebagai angka dalam rentang 0 hingga 65536, yang mewakili Unicode karakter kita. Ekspansi dan kontraksi tipe primitif - 6 Jadi begini. Saat kami melakukan penjumlahan chardan beberapa tipe bilangan bulat chardiubah menjadi angka yang sesuai dengannya di Unicode. Ketika pada kode kita ditambahkan 1 dan '1', maka simbol '1' diubah menjadi kodenya yaitu 49 (Anda dapat memeriksanya pada tabel di atas). Oleh karena itu, hasilnya menjadi sama dengan 50. Mari kita ambil lagi teman lama kita -sebagai contoh , dan coba menjumlahkannya dengan suatu bilangan.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
Output konsol: 33016 Kami telah mengetahui bahwasesuai dengan kode 32816. Dan ketika kami menambahkan angka ini dan 200, kami mendapatkan hasil persis seperti kami - 33016 :) Mekanisme operasinya, seperti yang Anda lihat, cukup sederhana.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION