JavaRush /Java Blog /Random-TK /Java-da başlangyç görnüşleri guýmak (öwürmek)

Java-da başlangyç görnüşleri guýmak (öwürmek)

Toparda çap edildi
Salam! JavaRush-dan geçip barýarkaňyz, ýönekeý görnüşlere bir gezekden köp duş geldiňiz. Ine, olar hakda bilýänlerimiziň gysga sanawy:
  1. Olar obýekt däl we ýatda saklanýan bahany görkezýär
  2. Ilkinji görnüşleriň birnäçe görnüşi bar:
    • Numbershli sanlar - byte,,,shortintlong
    • Loüzýän nokatlaryň sanlary (fraksiýa) - floatwedouble
    • Boolean -boolean
    • Simwoliki (harplary we sanlary görkezmek üçin) -char
  3. Olaryň hersiniň öz gymmatlyklary bar:
Ilkinji görnüş Memoryadyň ululygy Gymmatlyklaryň diapazony
baýt 8 bit -128-den 127-e çenli
gysga 16 bit -32768-den 32767-e çenli
char 16 bit 0-dan 65536-a çenli
int 32 bit -2147483648-den 2147483647-e çenli
uzyn 64 bit -9223372036854775808-den 9223372036854775807-e çenli
ýüzmek 32 bit (2-den güýje -149) çenli ((2-2 güýç -23) * 2-den 127-e çenli)
goşa 64 bit (-2-den 63-e çenli) ((2-den 63-e çenli) - 1)
boolean 8 (massiwlerde ulanylanda), 32 (massiw däl ulanylanda) dogry ýa-da ýalan
Valuesöne gymmatlyklardan başga-da görnüşler ýadyň ululygy bilen tapawutlanýar. intköp zady alýar byte. J long- köp short. Ilkinjileriň tutýan ýadynyň mukdaryny höwürtge gurjaklary bilen deňeşdirip bolar: Ilkinji görnüşleriň giňelmegi we gysylmagy - 2 Höwürtge gurjagynyň içinde boş ýer bar. Höwürtge gurjagy näçe uly bolsa, şonça-da köp ýer. Uly höwürtge gurjagynyň içinde longkiçisini aňsatlyk bilen goýup bileris int. Bu aňsatlyk bilen gabat gelýär we goşmaça bir zat etmegiň zerurlygy ýok. Java-da, ilkinjiler bilen işlenende, awtomatiki öwrülişik diýilýär. Başga bir usul bilen giňeltmek diýilýär. Ine, ýönekeý giňeltme mysaly:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byteBu ýerde üýtgeýjä baha belläris int. Bu ýumuş üstünlikli boldy we hiç hili kynçylyksyz: ýatda saklanylýan baha, byte“laýyk” bolanyndan has az ýat tutýar int. “Kiçijik höwürtge gurjagy” (gymmaty byte) “uly matrioşka” (üýtgeýän int) aňsatlyk bilen gabat gelýär. Munuň tersini etjek bolanyňyzda başga mesele - beýle ululyklar üçin döredilmedik üýtgeýjä uly baha goýuň. Aslynda, bu hile hakyky höwürtge gurjaklary bilen işlemez, ýöne Java-da işlär, ýöne nuanslar bilen. intÜýtgeýjä baha goýmaga synanyşalyň short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Roralňyşlyk! Düzüji, standart däl bir zat etjek bolýandygyňyza düşünýär we intkiçijik bir ( short) içinde uly matrioşka gurjagyny () goýýar. Bu ýagdaýda düzülen ýalňyşlyk düzüjiniň duýduryşy: “ Heý, muny etmek isleýändigiňize ynanýarsyňyzmy? "Ynanýan bolsaňyz, düzüjä bu barada aýdyň:" Hemme zat gowy, näme edýändigimi bilýärin! " “Bu prosese aç-açan görnüşe öwrülmek ýa-da daralmak diýilýär . Daralmak üçin, bahaňyzy goýmak isleýän görnüşiňizi aç-açan görkezmeli. Başgaça aýdylanda, düzüjiniň soragyna jogap beriň: “ Bolýar, bu kiçijik gurjaklaryň haýsysyny bu uly gurjak goýmak isleýärsiňiz?” "Biziň ýagdaýymyzda şeýle bolar:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
intBahany üýtgeýjä laýyk getirmek shortwe onuň üçin jogapkärçilik çekmek isleýändigimizi aç-açan görkezdik . Has düzüji, has dar görnüşiň aç-açan görkezilmegini görüp, öwrülişik edýär. Netije näme bolar? Konsol çykyşy: -27008 Birneme garaşylmadyk. Näme üçin beýle meňzeýär? Aslynda ýönekeý. intAsyl bahasy bardy - 10000000 32 bit alýan üýtgeýjide saklandy we ikilik görnüşinde şeýle boldy: Ilkinji görnüşleriň giňelmegi we gysylmagy - 3 Bu bahany üýtgeýjä ýazýarys short, ýöne ol diňe 16 bit saklap bilýär! Şoňa laýyklykda nomerimiziň diňe ilkinji 16 biti şol ýere göçüriler, galanlary taşlanar. Netijede, üýtgeýjide onluk görnüşde -27008 deň bolan shortbahany öz içine alar Ilkinji görnüşleriň giňelmegi we gysylmagy - 4, şonuň üçin düzüji belli bir görnüşe aç-açan guýmak görnüşinde “tassyklama sorady”. Birinjiden, netijäniň jogapkärçiligini öz üstüňe alýandygyňy görkezýär, ikinjiden, görnüşlere guýlanda düzüjä näçe ýer bölmelidigini aýdýar. intGalyberse-de, iň soňky mysalda ýazmak üçin atan bolsak byte, ýazmazdyk short, 16 däl-de, biziň ygtyýarymyzda bary-ýogy 8 bit bolardy we netijesi başgaça bolardy. Bölekleýin görnüşler ( floatwe double) üçin daralmak başgaça bolýar. Şeýle sanlary bitewi görnüşe öwürjek bolsaňyz, onuň bölek bölegi taşlanar.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Konsol çykyşy: 2

Maglumatlaryň görnüşi

Char görnüşiniň aýratyn nyşanlary görkezmek üçin ulanylýandygyny eýýäm bilýärsiňiz.
public static void main(String[] args) {

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

}
Itöne düşünmek üçin möhüm bolan birnäçe aýratynlyk bar. Geliň, bahalar aralygy bilen tablisa ýene bir gezek seredeliň:
Ilkinji görnüş Memoryadyň ululygy Gymmatlyklaryň diapazony
baýt 8 bit -128-den 127-e çenli
gysga 16 bit -32768-den 32767-e çenli
char 16 bit 0-dan 65536-a çenli
int 32 bit -2147483648-den 2147483647-e çenli
uzyn 64 bit -9223372036854775808-den 9223372036854775807-e çenli
ýüzmek 32 bit (2-den güýje -149) çenli ((2-2 güýç -23) * 2-den 127-e çenli)
goşa 64 bit (-2-den 63-e çenli) ((2-den 63-e çenli) -1)
boolean 8 (massiwlerde ulanylanda), 32 (massiw däl ulanylanda) dogry ýa-da ýalan
Görnüşiň char0 bilen 65536 aralygy aralygy bar. Thisöne bu nämäni aňladýar? Galyberse-de, charbular diňe sanlar däl, eýsem harplar, dyngy belgileri hem ... Hakykat, bahalaryň charJava-da icunikod görnüşinde saklanmagydyr. Öňki leksiýalaryň birinde “Unicode” bilen eýýäm duşuşdyk. Icunikodyň dünýäniň ähli ýazylan dillerinden diýen ýaly nyşanlary öz içine alýan nyşan kodlaýyş standartydygyny ýadyňyzdan çykarsaňyz gerek . Başga sözler bilen aýdylanda, bu islendik dilden islendik nyşan üçin kod bar bolan ýörite kodlaryň sanawy. Umumy “Unicode” tablisasy gaty uly we elbetde, ýatdan öwrenmegiň zerurlygy ýok. Bu ýerde, mysal üçin, onuň bir bölegi: Ilkinji görnüşleriň giňelmegi we gysylmagy - 5 Esasy zat gymmatlyklary saklamak ýörelgesine düşünmek charwe belli bir nyşanyň koduny bilmek bilen ony hemişe programmada alyp boljakdygyny ýadyňyzdan çykarmaň. Muny tötänleýin san bilen synap göreliň:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Konsol çykyşy: characters Bu, Java-da nyşanlaryň saklanýan formaty char. Her nyşan bir sana gabat gelýär - 16 bitli san kody ýa-da iki baýt. Icunikod 32816 the belgisine gabat gelýär. Şu pursata üns beriň. Bu mysalda üýtgeýjini ulandyk int. 32 bit ýat tutýar , char16 bolsa . Bu ýerde saýladyk , sebäbi zerur bolan 32816 sany, çäkden çykýar . Ululygy , gysga ýaly, 16 bit bolsa-da, aralykda negatiw sanlar ýok, şonuň üçin “polo positiveitel” diapazon iki esse uludyr (32767 ýerine 65536 ). Kodumyz 65536 aralygynda bolsa, ulanyp bileris. Aöne san döredsek , 16 bitden köp bolar. Görnüşleri daralanda: intshortcharcharcharshortintint >65536
char c = (char) x;
goşmaça bitler taşlanar we netijesi garaşylmadyk bolar.

Çar we bitewi sanlary goşmagyň aýratynlyklary

Geliň, bu üýtgeşik mysala seredeliň:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Konsol çykyşy: 50 O_O Logika nirede? 1 + 1, 50 nireden geldi ?! charGymmatlyklarymyzyň 0-dan 65536 aralygynda san hökmünde saklanýandygyny, häsiýetimiziň icunikodyny aňladýandygyny eýýäm bilýärsiňiz . Ilkinji görnüşleriň giňelmegi we gysylmagy - 6 Ine, şu ýerde. Goşmaçany ýerine ýetirenimizde charwe bitewi san görnüşi charicunikodda oňa laýyk gelýän sana öwrülýär. Kodymyzda 1 we '1' goşanymyzda, '1' nyşany 49 kody üýtgedildi (ýokardaky tablisada barlap bilersiňiz). Şonuň üçin netije 50-e deň boldy. Geliň, ýene bir gezek köne dostumyzy - mysal alalyň we ony san bilen goşmaga synanyşalyň.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Konsol çykyşy: 3301632816 kody bilen gabat gelýändigini eýýäm bildik. Bu belgini we 200-i goşanymyzda, netijämizi alarys - 33016 :) Görşüňiz ýaly iş mehanizmi gaty ýönekeý.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION