1. 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:

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 |
|---|---|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
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.
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 |
|---|---|
|
110 * 120 13,200 bo'ladi, bu byte turining maksimal qiymatidan bir oz ko'proq: 127 |
|
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 |
|---|---|
|
ifoda byte * byte int turida bo'ladi |
|
ifoda byte + byte int turida bo'ladi |
|
ifoda byte + int int turida bo'ladibirdan 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 |
|---|---|
|
Tur o'zgartirish operatori faqat a o'zgaruvchisiga qo'llaniladi, bu allaqachon byte turida. Kod kompilyatsiya qilinmaydi. |
|
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.
GO TO FULL VERSION