JavaRush /Kurslar /All lectures for UZ purposes /Java-da tur o'zgartirish

Java-da tur o'zgartirish

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Tur o'zgartirish

Java-da tur o'zgartirish

Primitive turdagi o'zgaruvchilar (boolean turidan tashqari) har xil son turlarini saqlash uchun ishlatiladi. Va garchi o'zgaruvchilar har doim bir xil bo'lsa-da, ular orasida turli xil turlarga o'tkazish mumkin. Bu taqsimlashdir.

Boshqa turdagi o'zgaruvchilarni bir-biriga taqdim etish mumkin. Shu sababli ikkita tur o'zgartirishi bor: kengaytirish va toraytirish.

Tur kengaytirish - bu kichik savatchadan kattasiga o'tkazish - bu operatsiya sezilmas va og'riqsiz sodir bo'ladi. Tur toraytirish - bu kattaroq savatchadan kichikroqqa ko'chirish: joy yetmasligi mumkin, va nimadir tashlanishi kerak.

Mana, "savatcha" hajmi bo'yicha tartiblangan turlar:

Java-da tur o'zgartirish 2


2. Tur kengaytirish

Ko'pincha boshqa son turi o'zgaruvchisiga bir turdagi o'zgaruvchini taqdim etish zarur bo'lishi mumkin. Qanday qilib buni amalga oshirish mumkin?

Java-da 4 butun son turi mavjud:

Tur Hajm
byte 1 байt
short 2 байt
int 4 байt
long 8 байt

Kattaroq o'lchamdagi o'zgaruvchiga har doim kichikroq o'lchamdagi o'zgaruvchilarni taqdim etish mumkin.

Long turida int, short va byte turlarida o'zgaruvchilarni taqdim qilish mumkin. int turida short va byte turlarida o'zgaruvchilarni taqdim etish mumkin. short turida byte turlarida o'zgaruvchilarni taqdim etish mumkin.

Misollar:

Kod Tavsif
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
Bu kod a'lo darajada kompilyatsiya qilinadi.

Bunday o'zgartirish, kichikroq turdan katta turga o'tkazish, tur kengaytirish deb ataladi.

Ha, lekin qiyosiy sonlar haqida nima deyish mumkin?

Ular bilan ham xuddi shunday - o'lcham muhim:

Tur Hajm
float 4 байt
double 8 байt

Double turiga float turidagi o'zgaruvchini muammosiz taqdim qilish mumkin. Lekin butun son turlari bilan qiziqroq.

Float turiga butun son turlarining har qandayini taqdim qilish mumkin. Hatto long turi, uning hajmi 8 байt. Double turiga esa har qanday narsa taqdim etilishi mumkin: har qanday butun son turi va float turi o'zgaruvchisi:

Kod Izoh
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

Diqqat qiling, tur o'zgartirish natijasi sifatining yomonlashishiga olib kelishi mumkin, chunki kerakli raqamlar yetishmaydi.

Butun sonlardan qiyosiy sonlarga o'tkazishda sonning eng kichik qismi olib tashlanishi mumkin. Ammo qiyosiy sonlarning maqsadi taxminiy qiymatni saqlash ekanligi sababli, bunday taqdim etish ruxsat etiladi.


3. Tur toraytirish

Boshqa imkoniyatlar haqida nima deyish mumkin? Agar int turi o'zgaruvchisini long turi o'zgaruvchisi qiymatini taqdim etish kerak bo'lsa nima qilish kerak?

Tasavvur qiling, o'zgaruvchi bu savat. Bizda har xil o'lchamdagi savatlar mavjud: 1, 2, 4 va 8 байt. Kichik savatdan kattasiga o'tkazishda muammo bo'lmaydi. Ammo kattaroqdan kichikroqqa o'tkazishda bir qismi yo'qolishi mumkin.

Bu o'zgartirish - katta o'lchamdagi turdan kichikroqqa o'tkazish - tur toraytirish deb ataladi. Bunday taqdim etishda sonning bir qismi yangi o'zgaruvchiga joylashmasligi va "chetda qolishi" mumkin.

Tur toraytirishda biz kompilyatorga xatoga yo'l qo'ymadik, va sonning bir qismini chiqarib tashlash qasddan qilinganligini ochiq ko'rsatishimiz kerak. Buning uchun tur o'zgartirish operatori ishlatiladi. Bu tur nomi qavs ichida ko'rsatilgan.

Bunday hollarda Java-kompilyator dasturchidan tur o'zgartirish operatorini ko'rsatishni talab qiladi. Bu umumiy holda quyidagicha ko'rinadi:

(tur) ifoda

Misollar:

Kod Tavsif
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
Har safar tur o'zgartirish operatorini ko'rsatish kerak.

Bu holda a 1 ga teng, va bu ortiqcha ko'rinadi. Ammo a katta bo'lganida-chi?

Kod Tavsif
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

Million long va int turiga juda yaxshi joylashadi. Ammo millionni short turiga taqdim etilganda, birinchi ikkita байt tashlandik va faqat so'nggi ikkita байt qoldi. Ba'zi oluvchi byte tipi bo'lganda esa, faqat bitta so'nggi байt qoldi.

Xotirada sonlarning joylashuvi:

Tur Ikkilik yozuvi O'nlik yozuvi
int 0b00000000000011110100001001000000 1,000,000
short 0b0100001001000000 16,960
byte 0b01000000 64

char turi

char turi, short turi singari, ikki байt qamrab oladi, ammo har doim bir-biriga o'tkazishda tur o'zgartirish operatori ishlatilishi kerak. Buning sababi, short turidek int bor va -32,768 dan 32,767 gacha bo'lgan qiymatlarni qamrab olishi mumkin, lekin char turida int yo'q va 0 dan 65,535 gacha bo'lgan qiymatlarni qamrab olishi mumkin.

char ga short da saqlanishi mumkin bo'lgan manfiy sonlarni saqlab bo'lmaydi. Va short ga char da saqlanishi mumkin bo'lgan 32,767 dan katta sonlarni saqlab bo'lmaydi.


4. Ifodaning turi

Agar bir xil turdagi emas, balki turli xil turdagi o'zgaruvchilar ifodada foydalanilsa nima qilish kerak? Mantiqiy javob - ularni avval umumiy turga aylantirish kerak. Ammo qaysi biri?

Albatta, kattasiga.

Java-da har doim turdagi kattaroqqa o'zgartirish sodir bo'ladi. Qo'pol qilib aytganda, avval operatsiyadagi qatlamlardan birining turi kengaytiriladi, keyin esa bir xil turdagi qiymatlar bilan operatsiya amalga oshiriladi.

Agar ifodada int va long turlar ishtirok etayotgan bo'lsa, int turdagi qiymat long turida o'zgartiriladi va faqat keyin operatsiyada ishtirok etadi:

Kod Tavsif
int a = 1;
long b = 2;
long c = a + b;
a long turida kengaytiriladi va keyin qo'shiladi.

Qiyosiy sonlar haqida

Agar ifodada butun son va qiyosiy son (float/double) ishtirok etadigan bo'lsa, butun son qiyosiy songa (float/double) o'zgartiriladi va faqat keyin ularda operatsiya amalga oshiriladi.

Agar operatsiyada float va double bo'lsa, float double ga o'zgartiriladi. Haqiqatan ham, kutganimizdek.

Ajablanarli

byte, short, char har doim int turiga o'zgartiriladi ularning bir-biri bilan oʻzaro ta'sirida. Axir int butun son turining standart turi hisoblanadi.

Agar byte va short ni ko'paytirsangiz, int bo'ladi. Agar byte ni byte ga ko'paytirsangiz, int bo'ladi. Hatto byte va byte ni qo'shsangiz ham, int bo'ladi.

Buning bir necha sabablari bor. Misollar:

Kod Tavsif
byte a = 110;
byte b = 120;
byte c = a * b;   // xato
110 * 120 13,200 bo'ladi, bu byte turining maksimal qiymatidan bir oz ko'proq: 127
byte a = 110;
byte b = 120;
byte c = a + b;   // xato
110 + 120 230 bo'ladi, bu ham byte turining maksimal qiymatidan bir oz ko'proq: 127

Umuman, 8 bit (1 байt) uzunlikdagi sonni 8 bit (1 байt) uzunlikdagi son bilan ko'paytirganda, 16 bit (2 байt) uzunlikdagi sonni olishimiz mumkin.

Shu sababli, int dan kichik butun son turlarida barcha operatsiyalar har doim int turiga o'zgartiriladi. Shuning uchun agar siz natijani int dan kichik turdagi o'zgaruvchiga saqlamoqchi bo'lsangiz, siz har doim tur o'zgartirish operatsiyasini ochiq ko'rsatishingiz kerak bo'ladi.

Misollar:

Kod Tavsif
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
ifoda byte * byte int turida bo'ladi
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
ifoda byte + byte int turida bo'ladi
byte a = 1;
byte b = (byte) (a + 1);
ifoda byte + int int turida bo'ladi
birdan biri - int turidagi literal.

5. Muhim nuqta

Tur o'zgartirish operatsiyasining ustunligi juda yuqori.

Shuning uchun, agar ifodada qo'shilish va tur o'zgartirish operatsiyasi mavjud bo'lsa, u qo'shilishdan oldin bajariladi.

Misol:

Kod Tavsif
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
Tur o'zgartirish operatori faqat a o'zgaruvchisiga qo'llaniladi, bu allaqachon byte turida. Kod kompilyatsiya qilinmaydi.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
Mana, to'g'ri.

Agar siz butun ifodani, nafaqat uning bir qismini, ma'lum bir turga o'zgartirmoqchi bo'lsangiz, barcha ifodani qavslar ichiga oling va ularning oldiga tur o'zgartirish operatorini qo'ying.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION