KodeGym/Blog Jawa/Acak/Widening lan Narrowing saka jinis primitif
John Squirrels
tingkat
San Francisco

Widening lan Narrowing saka jinis primitif

Diterbitake ing grup
Hi! Nalika sampeyan wis maju liwat CodeGym, sampeyan wis nemoni jinis primitif kaping pirang-pirang. Mangkene dhaptar ringkes babagan apa sing kita ngerti babagan dheweke:
  1. Padha ora obyek lan makili nilai sing disimpen ing memori
  2. Ana sawetara jinis
    • Nomer wutuh: byte , short , int , long
    • Angka floating-point (fractional): float lan dobel
    • Nilai logika: boolean
    • Nilai simbolis (kanggo makili huruf lan angka): char
  3. Saben jinis duwe sawetara nilai dhewe:

Tipe primitif Ukuran ing memori Range nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit -32768 kanggo 32767
char 16 bit 0 kanggo 65536
int 32 bit -2147483648 kanggo 2147483647
dawa 64 bit -9223372036854775808 kanggo 9223372036854775807
ngambang 32 bit (2 kanggo daya saka -149) kanggo ((2 - (2 kanggo daya saka -23)) * 2 kanggo daya saka 127)
pindho 64 bit (-2 kanggo daya saka 63) kanggo ((2 kanggo daya saka 63) - 1)
boolean 8 (yen digunakake ing larik), 32 (yen ora digunakake ing larik) bener utawa salah
Nanging saliyane duwe nilai beda, padha uga beda-beda ing pinten papan padha manggoni ing memori. Int njupuk luwih saka bait . Lan sing dawa luwih gedhe tinimbang sing cendhak. Jumlah memori sing dikuwasani dening primitif bisa dibandhingake karo boneka nesting Rusia: Widening lan narrowing jinis primitif - 2 Saben boneka nesting duwe ruang sing kasedhiya ing njero. Sing luwih gedhe boneka nesting, luwih akeh papan sing ana. Boneka nesting gedhe ( dawa ) bakal gampang nampung int sing luwih cilik . Gampang pas lan sampeyan ora perlu nindakake apa-apa. Ing Jawa, nalika nggarap primitif, iki diarani konversi implisit. Utawa bedane, diarani widening.

Widening ing Jawa

Punika conto prasaja saka konversi widening:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Ing kene kita nemtokake nilai byte menyang variabel int . Tugas kasebut sukses tanpa masalah: nilai sing disimpen ing bait njupuk memori kurang saka apa sing bisa ditampung int . Boneka nesting cilik (nilai byte) gampang pas karo boneka nesting gedhe ( variabel int ). Beda yen sampeyan nyoba ngelawan, yaiku nglebokake nilai gedhe menyang variabel sing jangkauane ora bisa nampung jinis data sing gedhe. Kanthi boneka nesting nyata, nomer kasebut ora cocog. Kanthi Jawa, bisa, nanging kanthi nuansa. Ayo nyoba nglebokake int menyang variabel singkat :
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;// Error!
   System.out.println(bigNumber);
}
Kesalahan! Compiler mangertos yen sampeyan nyoba kanggo nindakake soko ora normal dening shoving boneka nesting gedhe ( int ) nang cilik ( singkat ). Ing kasus iki, kesalahan kompilasi minangka bebaya saka compiler: "Hei, sampeyan pancen yakin yen sampeyan pengin nindakake iki?" Yen sampeyan yakin, banjur sampeyan ngandhani kompiler: "Kabeh ora apa-apa. Aku ngerti apa sing daklakoni!" Proses iki diarani konversi jinis eksplisit, utawa narrowing.

Sempit ing Jawa

Kanggo nindakake konversi sing sempit, sampeyan kudu kanthi jelas nuduhake jinis sing pengin diowahi nilai sampeyan. Kanthi tembung liya, sampeyan kudu mangsuli pitakon panyusun: "Inggih, endi saka boneka nesting cilik iki sing arep dilebokake boneka nesting gedhe iki?" Ing kasus kita, katon kaya iki:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
Kita kanthi jelas nuduhake yen kita pengin nglebokake int menyang variabel cendhak lan kita bakal tanggung jawab. Ningali yen jinis sing luwih sempit wis dituduhake kanthi jelas, kompiler nindakake konversi. Apa asile? Output konsol: -27008 Sing ora dikarepke. Yagene persis kita entuk? Nyatane, kabeh iku prasaja banget. Originally, nilai kasebut 10000000 Iki disimpen ing variabel int , sing nduweni 32 bit. Iki minangka perwakilan binar:
Widening lan narrowing jinis primitif - 3
Kita nulis nilai iki menyang variabel cendhak , sing mung bisa nyimpen 16 bit! Mulane, mung 16 bit pisanan saka nomer kita sing bakal dipindhah ing kana. Liyane bakal dibuwang. Akibaté, variabel cendhak nampa nilai ing ngisor iki
Widening lan narrowing jinis primitif - 4
kang ing wangun desimal padha karo -27008 Pramila compiler takon sampeyan "konfirmasi" dening nuduhake konversi narrowing eksplisit kanggo jinis tartamtu. Kaping pisanan, iki nuduhake yen sampeyan tanggung jawab kanggo asil kasebut. Lan kaloro, ngandhani compiler carane akeh papan kanggo nyedhiakke nalika nindakake mengkono. Sawise kabeh, ing conto pungkasan, yen kita nemtokake nilai int menyang variabel byte tinimbang short , banjur kita mung duwe 8 bit ing pembuangan, ora 16, lan asil bakal beda. Jinis pecahan ( ngambang lan dobel ) duwe proses dhewe kanggo nyepetake konversi. Yen sampeyan nyoba nyithak nomer fraksi menyang jinis integer, bagean pecahan bakal dibuwak.
public static void main(String[] args) {

   double d = 2.7;

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

char

Sampeyan wis ngerti yen char digunakake kanggo nampilake karakter individu.
public static void main(String[] args) {

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

}
Nanging jinis data iki nduweni sawetara fitur sing penting dimangerteni. Ayo katon maneh ing tabel rentang nilai:
Tipe primitif Ukuran ing memori Range nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit -32768 kanggo 32767
char 16 bit 0 kanggo 65536
int 32 bit -2147483648 kanggo 2147483647
dawa 64 bit -9223372036854775808 kanggo 9223372036854775807
ngambang 32 bit (2 kanggo daya saka -149) kanggo ((2 - (2 kanggo daya saka -23)) * 2 kanggo daya saka 127)
pindho 64 bit (-2 kanggo daya saka 63) kanggo ((2 kanggo daya saka 63) - 1)
boolean 8 (yen digunakake ing larik), 32 (yen ora digunakake ing larik) bener utawa salah
Kisaran 0 nganti 65536 dituduhake kanggo jinis char . Nanging apa tegese? Sawise kabeh, char ora mung makili angka, nanging uga huruf, tandha wacan… Bab iku ing Jawa nilai char disimpen ing format Unicode. Kita wis nemoni Unicode ing salah sawijining pelajaran sadurunge. Sampeyan bisa uga eling yen Unicode minangka standar enkoding karakter sing kalebu simbol meh kabeh basa tulis ing donya. Ing tembung liya, iki minangka dhaptar kode khusus sing makili meh kabeh karakter ing basa apa wae. Tabel Unicode kabeh gedhe banget, lan, mesthi, ora perlu sinau kanthi ati-ati. Punika bagean cilik saka iku: Widening lan narrowing jinis primitif - 5 Wangsulan: Bab ingkang utama iku ngerti carane chars disimpen, lan elinga yen sampeyan ngerti kode kanggo karakter tartamtu, sampeyan bisa tansah gawé karakter sing ing program. Ayo coba nganggo nomer acak:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Output konsol: 耰 Iki minangka format sing digunakake kanggo nyimpen aksara ing Jawa. Saben simbol cocog karo nomer: kode numerik 16-bit (loro-byte). Ing Unicode, 32816 cocog karo karakter Cina 耰. Gatekna titik ing ngisor iki. Ing conto iki, kita nggunakake variabel int . Iku occupies 32 bit ing memori, nalika char manggoni 16. Kene kita milih int , amarga nomer kita (32816) ora pas ing short . Sanajan ukuran char (kaya sing cendhak ) yaiku 16 bit, ora ana nomer negatif ing rentang char , mula bagean "positif" saka charsawetara kaping pindho minangka gedhe (65536 tinimbang 32767 kanggo jinis singkat ). Kita bisa nggunakake int anggere kode kita tetep ngisor 65536. Nanging yen sampeyan nggawe nilai int luwih saka 65536, iku bakal manggoni luwih saka 16 bit. Lan iki bakal nyebabake konversi sing sempit
char c = (char) x;
bit ekstra bakal dibuwak (minangka rembugan ndhuwur) lan asil bakal cukup ora dikarepke.

Fitur khusus kanggo nambah karakter lan integer

Ayo goleki conto sing ora biasa:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i + c);
   }
}
Output console: 50 O_О Carane nggawe pangertèn? 1+1. 50 saka ngendi ?! Sampeyan wis ngerti yen charnilai disimpen ing memori minangka nomer ing sawetara saka 0 kanggo 65536, lan nomer iki minangka perwakilan Unicode saka karakter. Widening lan narrowing jinis primitif - 6 Nalika kita nambahake karakter lan sawetara jinis nomer wutuh, karakter kasebut diowahi dadi nomer Unicode sing cocog. Ing kode kita, nalika kita nambahake 1 lan '1', simbol '1' diowahi dadi kode dhewe, yaiku 49 (sampeyan bisa verifikasi iki ing tabel ing ndhuwur). Mula, asile 50. Ayo maneh njupuk kanca lawas 耰 minangka conto, lan coba ditambahake menyang sawetara nomer.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Output konsol: 33016 Kita wis nemokake yen 耰 cocog karo 32816. Lan nalika kita nambah nomer iki lan 200, kita entuk asil: 33016. :) Nalika sampeyan bisa ndeleng, algoritma ing kene cukup prasaja, nanging sampeyan ora kudu lali. .
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar