JavaRush /Java blogi /Random-UZ /Java-da ibtidoiy turlarni quyish (konvertatsiya qilish).

Java-da ibtidoiy turlarni quyish (konvertatsiya qilish).

Guruhda nashr etilgan
Salom! JavaRush orqali o'tayotganda siz ibtidoiy turlarga bir necha marta duch kelgansiz. Mana ular haqida biz bilgan narsalarning qisqa ro'yxati:
  1. Ular ob'ektlar emas va xotirada saqlangan qiymatni ifodalaydi
  2. Bir necha turdagi ibtidoiy turlar mavjud:
    • Butun sonlar - byte, short, int,long
    • Suzuvchi nuqta raqamlari (kasr) - floatvadouble
    • Mantiqiy -boolean
    • Ramziy (harflar va raqamlarni ko'rsatish uchun) -char
  3. Ularning har biri o'ziga xos qiymatlarga ega:
Primitiv tip Xotiradagi o'lcham Qiymatlar diapazoni
bayt 8 bit -128 dan 127 gacha
qisqa 16 bit -32768 dan 32767 gacha
char 16 bit 0 dan 65536 gacha
int 32 bit -2147483648 dan 2147483647 gacha
uzoq 64 bit -9223372036854775808 dan 9223372036854775807 gacha
suzmoq 32 bit dan (2 quvvatga -149) gacha ((2-2 quvvatga -23)*2 quvvatga 127)
ikki barobar 64 bit dan (-2 ning 63 darajasiga) ((2 ning 63 ning darajasiga) - 1) gacha
mantiqiy 8 (massivlarda foydalanilganda), 32 (massiv bo'lmaganlarda ishlatilganda) To'g'ri yoki noto'g'ri
Ammo, qiymatlardan tashqari, turlar xotira hajmida ham farqlanadi. intdan ko'proq narsani oladi byte. A long- dan ortiq short. Ibtidoiy qo'g'irchoqlar egallagan xotira hajmini uy qurgan qo'g'irchoqlar bilan taqqoslash mumkin: Ibtidoiy turlarning kengayishi va qisqarishi - 2 Uy quradigan qo'g'irchoq ichida bo'sh joy mavjud. Uy quradigan qo'g'irchoq qanchalik katta bo'lsa, shunchalik ko'p joy bo'ladi. longKichkinasini osongina katta yuva qo'g'irchog'i ichiga qo'yishimiz mumkin int. Bu osongina mos keladi va siz qo'shimcha hech narsa qilishingiz shart emas. Java-da primitivlar bilan ishlashda bu avtomatik konvertatsiya deb ataladi. Boshqacha qilib aytganda, u kengaytma deb ataladi. Mana oddiy kengaytma misoli:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byteBu erda biz o'zgaruvchiga qiymat beramiz int. Topshiriq muvaffaqiyatli va hech qanday muammosiz amalga oshirildi: ichida saqlangan qiymat bytexotirada "mos keladigan" dan kamroq joy egallaydi int. "Kichik uyali qo'g'irchoq" (qiymat byte) "katta matryoshka" (o'zgaruvchan int) ga osongina mos keladi. Buning teskarisini qilishga harakat qilganingizda, bu boshqa masala - bunday o'lchamlar uchun mo'ljallanmagan o'zgaruvchiga katta qiymat qo'ying. Aslida, bu hiyla haqiqiy uyali qo'g'irchoqlar bilan ishlamaydi, lekin Java-da u ishlaydi, lekin nuanslar bilan. intKeling, o'zgaruvchiga qiymat qo'yishga harakat qilaylik short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Xato! Tuzuvchi siz nostandart biror narsa qilmoqchi ekanligingizni tushunadi va intkichik () ichiga katta matryoshka qo'g'irchog'ini qo'ying ( short). Bu holatda kompilyatsiya xatosi kompilyatorning ogohlantirishidir: “ Hey, buni qilishni xohlaysizmi? "Agar ishonchingiz komil bo'lsa, bu haqda kompilyatorga ayting:" Hammasi yaxshi, men nima qilayotganimni bilaman!" ” Bu jarayon aniq turdagi konvertatsiya deb ataladi, yoki toraytirish . Toraytirish uchun siz o'z qiymatingizni qaysi turga kiritmoqchi ekanligingizni aniq ko'rsatishingiz kerak. Boshqacha qilib aytganda, kompilyatorning savoliga javob bering: " Xo'sh, bu katta qo'g'irchoqni qaysi qo'g'irchoqqa qo'ymoqchisiz?" ” Bizning holatimizda u quyidagicha ko'rinadi:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
intBiz qiymatni o'zgaruvchiga moslashtirmoqchi ekanligimizni shortva buning uchun javobgarlikni o'z zimmamizga olishni aniq ko'rsatdik. Kompilyator torroq turdagi aniq ko'rsatmani ko'rib, konversiyani amalga oshiradi. Natija qanday bo'ladi? Konsol chiqishi: -27008 Bir oz kutilmagan. Nega aynan shunday? Bu aslida oddiy. intBizda asl qiymat bor edi - 10000000 U 32 bitni egallagan o'zgaruvchida saqlangan va ikkilik shaklda u shunday ko'rinardi: Ibtidoiy turlarning kengayishi va qisqarishi - 3 Biz bu qiymatni o'zgaruvchiga yozamiz short, lekin u faqat 16 bitni saqlashi mumkin! Shunga ko'ra, bizning raqamimizning faqat birinchi 16 biti u erga ko'chiriladi, qolganlari o'chiriladi. Natijada, o'zgaruvchi o'nlik ko'rinishda -27008 ga to'liq teng bo'lgan shortqiymatni o'z ichiga oladi Ibtidoiy turlarning kengayishi va qisqarishi - 4, shuning uchun kompilyator ma'lum bir turga aniq uzatish shaklida "tasdiqlashni so'radi". Birinchidan, bu sizning natija uchun mas'uliyatni o'z zimmangizga olishingizni ko'rsatadi, ikkinchidan, kompilyatorga turlarni quyishda qancha joy ajratish kerakligini aytadi. Axir, agar oxirgi misolda ga emas, balki inttype ga aylantirganimizda , bizning ixtiyorimizda 16 emas, atigi 8 bit bo'lar edi va natija boshqacha bo'lar edi. Fraksiyonel turlar uchun ( va ), torayish boshqacha sodir bo'ladi. Agar siz bunday sonni butun son turiga aylantirmoqchi bo'lsangiz, uning kasr qismi o'chiriladi. byteshortfloatdouble
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Konsol chiqishi: 2

Ma'lumotlar turi char

Siz allaqachon bilasizki, char turi individual belgilarni ko'rsatish uchun ishlatiladi.
public static void main(String[] args) {

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

}
Lekin u tushunish uchun muhim bo'lgan bir qator xususiyatlarga ega. Keling, qiymat diapazonlari bilan jadvalga yana qaraylik:
Primitiv tip Xotiradagi o'lcham Qiymatlar diapazoni
bayt 8 bit -128 dan 127 gacha
qisqa 16 bit -32768 dan 32767 gacha
char 16 bit 0 dan 65536 gacha
int 32 bit -2147483648 dan 2147483647 gacha
uzoq 64 bit -9223372036854775808 dan 9223372036854775807 gacha
suzmoq 32 bit dan (2 quvvatga -149) gacha ((2-2 quvvatga -23)*2 quvvatga 127)
ikki barobar 64 bit dan (-2 ning 63 darajasiga) dan ((2 ning 63 darajasiga)-1) gacha
mantiqiy 8 (massivlarda foydalanilganda), 32 (massiv bo'lmaganlarda ishlatilganda) To'g'ri yoki noto'g'ri
Tur char0 dan 65536 gacha bo'lgan sonli diapazonga ega. Lekin bu nimani anglatadi? Axir charbular nafaqat raqamlar, balki harflar, tinish belgilari ham... Gap shundaki, qiymatlar charJava-da Unicode formatida saqlanadi. Oldingi ma'ruzalardan birida biz Unicode bilan uchrashganmiz. Esingizda bo'lsa kerak, Unicode - bu dunyoning deyarli barcha yozma tillaridagi belgilarni o'z ichiga olgan belgilar kodlash standarti. Boshqacha qilib aytganda, bu har qanday tildan deyarli har qanday belgi uchun kod mavjud bo'lgan maxsus kodlar ro'yxati. Umumiy Unicode jadvali juda katta va, albatta, yoddan o'rganish shart emas. Bu erda, masalan, uning bir qismi: Ibtidoiy turlarning kengayishi va qisqarishi - 5 Asosiysi, qadriyatlarni saqlash tamoyilini tushunish char, va esda tutingki, ma'lum bir belgining kodini bilib, uni har doim dasturda olishingiz mumkin. Keling, buni tasodifiy raqam bilan sinab ko'raylik:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Konsol chiqishi: Bu Java-da belgilar saqlanadigan formatdir char. Har bir belgi raqamga mos keladi - 16 bitli raqamli kod yoki ikki bayt. Unicode 32816 zhi belgisiga mos keladi. Ushbu daqiqaga e'tibor bering. Ushbu misolda biz o'zgaruvchidan foydalandik int. Xotirada 32 bit , char16 bitni egallaydi . Bu erda biz tanladik , chunki bizga kerak bo'lgan raqam 32816 diapazondan tashqarida . Garchi o'lcham , qisqa bo'lgani kabi, 16 bit bo'lsa-da, diapazonda salbiy raqamlar yo'q, shuning uchun "ijobiy" diapazon ikki baravar katta (32767 o'rniga 65536 ). Kodimiz 65536 oralig'ida bo'lsa, biz dan foydalanishimiz mumkin. Lekin agar biz raqam yaratsak , u 16 bitdan ko'proq vaqtni oladi. Va turlarni qisqartirganda: intshortcharcharcharshortintint >65536
char c = (char) x;
qo'shimcha bitlar tashlanadi va natija juda kutilmagan bo'ladi.

Belgi va butun sonlarni qo'shish xususiyatlari

Keling, ushbu noodatiy misolni ko'rib chiqaylik:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Konsol chiqishi: 50 O_O Mantiq qayerda? 1+1, 50 qayerdan paydo bo'ldi?! Siz allaqachon bilasizki, qiymatlar charxotirada 0 dan 65536 gacha bo'lgan raqamlar sifatida saqlanadi, bu bizning xarakterimizning Unicode kodini anglatadi. Ibtidoiy turlarning kengayishi va qisqarishi - 6 Demak, bu yerda. Biz qo'shishni amalga oshirganimizda charva ba'zi bir butun son turi charUnicode'da unga mos keladigan raqamga aylantiriladi. Kodimizga 1 va '1' qo'shganimizda, '1' belgisi uning kodiga aylantirildi, ya'ni 49 (siz buni yuqoridagi jadvalda tekshirishingiz mumkin). Shunday qilib, natija 50 ga teng bo'ldi. Keling, yana bir bor eski do'stimizni misol qilib olaylik va uni qandaydir raqam bilan qo'shishga harakat qilaylik.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Konsol chiqishi: 33016 32816 kodiga to'g'ri kelishini allaqachon aniqladik. Bu raqam va 200 ni qo'shsak, biz aniq natijaga erishamiz - 33016 :) Ishlash mexanizmi, siz ko'rib turganingizdek, juda oddiy.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION