CodeGym/Java Blog/Acak/Pelebaran dan Penyempitan tipe primitif
John Squirrels
Level 41
San Francisco

Pelebaran dan Penyempitan tipe primitif

Dipublikasikan di grup Acak
anggota
Hai! Saat Anda telah berkembang melalui CodeGym, Anda telah menemukan tipe primitif berkali-kali. Berikut adalah daftar singkat dari apa yang kita ketahui tentang mereka:
  1. Mereka bukan objek dan mewakili nilai yang disimpan dalam memori
  2. Ada beberapa macam
    • Bilangan bulat: byte , short , int , long
    • Angka floating-point (pecahan): float dan double
    • Nilai logis: boolean
    • Nilai simbolik (untuk mewakili huruf dan angka): char
  3. Setiap jenis memiliki rentang nilainya sendiri:

Tipe primitif Ukuran dalam memori Kisaran nilai
byte 8 bit -128 hingga 127
pendek 16 bit -32768 hingga 32767
arang 16 bit 0 hingga 65536
int 32 bit -2147483648 hingga 2147483647
panjang 64 bit -9223372036854775808 ke 9223372036854775807
mengambang 32 bit (2 pangkat -149) ke ((2 - (2 pangkat -23)) * 2 pangkat 127)
dobel 64 bit (-2 pangkat 63) ke ((2 pangkat 63) - 1)
boolean 8 (bila digunakan dalam array), 32 (jika tidak digunakan dalam array) benar atau salah
Namun selain memiliki nilai yang berbeda, mereka juga berbeda dalam seberapa banyak ruang yang mereka tempati dalam memori. Sebuah int membutuhkan lebih dari satu byte. Dan panjang lebih besar dari pendek. Jumlah memori yang ditempati oleh primitif dapat dibandingkan dengan boneka bersarang Rusia: Pelebaran dan penyempitan tipe primitif - 2 Setiap boneka bersarang memiliki ruang yang tersedia di dalamnya. Semakin besar boneka bersarang, semakin banyak ruang yang tersedia. Boneka bersarang yang besar ( panjang ) akan dengan mudah menampung int yang lebih kecil . Mudah dipasang dan Anda tidak perlu melakukan hal lain. Di Jawa, saat bekerja dengan primitif, ini disebut konversi implisit. Atau dengan kata lain, itu disebut pelebaran.

Pelebaran di Pulau Jawa

Berikut adalah contoh sederhana konversi pelebaran:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Di sini kami menetapkan nilai byte ke variabel int . Penugasan berhasil tanpa masalah: nilai yang disimpan dalam byte membutuhkan lebih sedikit memori daripada yang dapat ditampung oleh int . Boneka bersarang kecil (nilai byte) dengan mudah masuk ke dalam boneka bersarang besar ( variabel int ). Lain halnya jika Anda mencoba melakukan sebaliknya, yaitu memasukkan nilai besar ke dalam variabel yang jangkauannya tidak dapat mengakomodasi tipe data sebesar itu. Dengan boneka bersarang sungguhan, jumlahnya tidak akan cocok. Dengan Java, bisa, tapi dengan nuansa. Mari kita coba memasukkan int ke dalam variabel pendek :
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 normal dengan memasukkan boneka bersarang besar ( int ) ke dalam boneka kecil ( short ). Dalam hal ini, kesalahan kompilasi adalah peringatan dari kompiler: "Hei, apakah Anda benar-benar yakin ingin melakukan ini?" Jika Anda yakin, beri tahu kompiler: "Semuanya baik-baik saja. Saya tahu apa yang saya lakukan!" Proses ini disebut konversi tipe eksplisit, atau penyempitan.

Penyempitan di Jawa

Untuk melakukan konversi penyempitan, Anda perlu secara eksplisit menunjukkan jenis nilai yang ingin Anda konversi. Dengan kata lain, Anda perlu menjawab pertanyaan penyusun: "Nah, boneka bersarang kecil yang mana yang ingin Anda masukkan ke dalam boneka bersarang besar ini?" Dalam kasus kami, tampilannya 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 int ke dalam variabel pendek dan kami akan bertanggung jawab. Melihat bahwa tipe yang lebih sempit telah ditunjukkan secara eksplisit, kompiler melakukan konversi. Apa hasilnya? Keluaran konsol: -27008 Itu sedikit tidak terduga. Mengapa tepatnya kita mendapatkan itu? Faktanya, semuanya sangat sederhana. Awalnya, nilainya 10000000 Itu disimpan dalam variabel int , yang menempati 32 bit. Ini adalah representasi binernya:
Pelebaran dan penyempitan tipe primitif - 3
Kami menulis nilai ini ke dalam variabel pendek , yang hanya dapat menyimpan 16 bit! Karenanya, hanya 16 bit pertama dari nomor kita yang akan dipindahkan ke sana. Sisanya akan dibuang. Akibatnya, variabel pendek menerima nilai berikut
Pelebaran dan penyempitan tipe primitif - 4
yang dalam bentuk desimal sama dengan -27008 Itulah sebabnya kompiler meminta Anda untuk "mengkonfirmasi" dengan menunjukkan konversi penyempitan eksplisit ke jenis tertentu. Pertama, ini menunjukkan bahwa Anda bertanggung jawab atas hasilnya. Dan kedua, ini memberi tahu kompiler berapa banyak ruang yang harus dialokasikan saat konversi terjadi. Lagi pula, dalam contoh terakhir, jika kita menetapkan nilai int ke variabel byte daripada short , maka kita hanya akan memiliki 8 bit, bukan 16, dan hasilnya akan berbeda. Jenis pecahan ( float dan double ) memiliki prosesnya sendiri untuk mempersempit konversi. Jika Anda mencoba mentransmisikan nomor faksi ke tipe bilangan bulat, bagian pecahan akan dibuang.
public static void main(String[] args) {

   double d = 2.7;

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

arang

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

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

}
Namun tipe data ini memiliki beberapa fitur yang penting untuk dipahami. Mari kita lihat lagi tabel rentang nilai:
Tipe primitif Ukuran dalam memori Kisaran nilai
byte 8 bit -128 hingga 127
pendek 16 bit -32768 hingga 32767
arang 16 bit 0 hingga 65536
int 32 bit -2147483648 hingga 2147483647
panjang 64 bit -9223372036854775808 ke 9223372036854775807
mengambang 32 bit (2 pangkat -149) ke ((2 - (2 pangkat -23)) * 2 pangkat 127)
dobel 64 bit (-2 pangkat 63) ke ((2 pangkat 63) - 1)
boolean 8 (bila digunakan dalam array), 32 (jika tidak digunakan dalam array) benar atau salah
Kisaran 0 hingga 65536 diindikasikan untuk tipe char . Tapi apa artinya itu? Lagi pula, char tidak hanya mewakili angka, tetapi juga huruf, tanda baca… Masalahnya, di Java, nilai char disimpan dalam format Unicode. Kami telah menemukan Unicode di salah satu pelajaran sebelumnya. Anda mungkin ingat bahwa Unicode adalah standar pengkodean karakter yang menyertakan simbol dari hampir semua bahasa tertulis di dunia. Dengan kata lain, ini adalah daftar kode khusus yang mewakili hampir semua karakter dalam bahasa apa pun. Seluruh tabel Unicode sangat besar, dan, tentu saja, tidak perlu mempelajarinya dengan hati. Ini sebagian kecilnya: Pelebaran dan penyempitan tipe primitif - 5 Hal utama adalah memahami bagaimana karakter disimpan, dan mengingat bahwa jika Anda mengetahui kode untuk karakter tertentu, Anda selalu dapat menghasilkan karakter tersebut dalam program Anda. Mari kita coba dengan beberapa nomor acak:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Keluaran konsol: 耰 Ini adalah format yang digunakan untuk menyimpan karakter di Java. Setiap simbol sesuai dengan angka: kode numerik 16-bit (dua byte). Di Unicode, 32816 sesuai dengan karakter Cina 耰. Catat poin berikut. Dalam contoh ini, kami menggunakan variabel int . Ini menempati 32 bit dalam memori, sedangkan char menempati 16. Di sini kami memilih int , karena nomor kami (32816) tidak muat dalam short . Meskipun ukuran char ( seperti short ) adalah 16 bit, tidak ada bilangan negatif dalam rentang char , jadi bagian "positif" dari charrentang dua kali lebih besar (65536 bukannya 32767 untuk tipe pendek ). Kita dapat menggunakan int selama kode kita tetap di bawah 65536. Tetapi jika Anda membuat nilai int lebih besar dari 65536, maka int tersebut akan menempati lebih dari 16 bit. Dan ini akan menghasilkan konversi yang menyempit
char c = (char) x;
bit ekstra akan dibuang (seperti yang dibahas di atas) dan hasilnya akan sangat tidak terduga.

Fitur khusus menambahkan karakter dan bilangan bulat

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

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i + c);
   }
}
Keluaran konsol: 50 O_О Bagaimana itu masuk akal? 1+1. Dari mana 50 itu berasal?! Anda sudah tahu bahwa charnilai disimpan dalam memori sebagai angka dalam rentang dari 0 hingga 65536, dan angka ini adalah representasi karakter Unicode. Pelebaran dan penyempitan tipe primitif - 6 Saat kita menambahkan karakter dan beberapa tipe bilangan bulat, karakter diubah menjadi nomor Unicode yang sesuai. Dalam kode kita, ketika kita menambahkan 1 dan '1', simbol '1' diubah menjadi kodenya sendiri, yaitu 49 (Anda dapat memverifikasi ini pada tabel di atas). Oleh karena itu, hasilnya adalah 50. Sekali lagi mari kita ambil teman lama kita 耰 sebagai contoh, dan coba tambahkan ke beberapa angka.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Output konsol: 33016 Kami telah menemukan bahwa 耰 sesuai dengan 32816. Dan ketika kami menambahkan angka ini dan 200, kami mendapatkan hasil kami: 33016. :) Seperti yang Anda lihat, algoritme di sini cukup sederhana, tetapi Anda tidak boleh melupakannya .
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar