5.2 Toraytiruvchi va kengaytiruvchi transformatsiyalar Transformatsiyalar torayuvchi (torayuvchi) va kengaytiruvchi (kengayuvchi) bo'lishi mumkin. Kengaytirilgan konversiyalar xotiradagi ob'ekt hajmini kengaytiradi. Misol uchun:
bitta
2
byte a = 4; // 0000100
ushort b = a; // 000000000000100
Bunda ushort tipidagi o'zgaruvchiga bayt tipidagi qiymat beriladi. Bayt turi 1 baytni (8 bit) egallaydi va a o'zgaruvchining ikkilik qiymati quyidagicha ifodalanishi mumkin:
1
00000100
Qisqa qiymat 2 bayt (16 bit). Va b o'zgaruvchini tayinlashda a o'zgaruvchining qiymati 2 baytgacha kengaytiriladi
1
0000000000000100
Ya'ni, 8 bitni egallagan qiymat 16 bitgacha kengaytiriladi .
Toraytiruvchi konvertatsiyalar esa, qiymatni kamroq bitlik turiga toraytiradi. Maqolaning ikkinchi ro'yxatida biz faqat toraytirilgan o'zgarishlar bilan shug'ullandik:
1
2
ushort a = 4;
byte b = (byte) a;
Bu erda 8 bitni egallagan b o'zgaruvchisiga 16 bitni egallagan ushort qiymati beriladi. Ya'ni, 0000000000000100 bizdan olamiz 00000100. Shunday qilib, qiymat 16 bitdan (2 bayt) 8 bitgacha (1 bayt) torayadi.
5.3 Aniq va yashirin konvertatsiyalar Yashirin konvertatsiyalar
Konversiyalarni kengaytirganda, kompilyator biz uchun barcha ma'lumotlarni o'zgartirishni amalga oshirdi, ya'ni konvertatsiyalar yashirin konvertatsiyalar edi . Bunday o'zgarishlar hech qanday qiyinchilik tug'dirmaydi. Shunga qaramay, bunday o'zgarishlarning umumiy mexanikasi haqida bir necha so'z aytish kerak. Agar konversiya kichikroq bit chuqurligining belgisiz turidan kattaroq bit kengligining belgisiz turiga o'tkazilsa, u holda qiymatlari 0 bo'lgan qo'shimcha bitlar qo'shiladi. Bu nol to'ldirish yoki nol kengaytma deyiladi.
1
2
byte a = 4; // 0000100
ushort b = a; // 000000000000100
Agar belgilangan turga o'tkazish amalga oshirilsa, agar raqam musbat bo'lsa, bit tasviri nol bilan to'ldiriladi, agar raqam manfiy bo'lsa. Raqamning oxirgi bitida ishora biti mavjud - musbat raqamlar uchun 0 va manfiy raqamlar uchun 1. Qo'shilgan bitlarga kengaytirilganda, belgi biti kompilyatsiya qilinadi.
Musbat raqamni aylantirishni o'ylab ko'ring:
1
2
sbyte a = 4; // 0000100
short b = a; // 000000000000100
Manfiy raqamni aylantirish:
1
2
sbyte a = -4; // 1111100
short b = a; // 111111111111100
Aniq konvertatsiyalar
Aniq konvertatsiyalar ( aniq konvertatsiya ) bilan biz o'zimiz konvertatsiya operatsiyasini (operatsiyani ()) qo'llashimiz kerak. Turni o'zgartirish operatsiyasining mohiyati shundan iboratki, qiymatdan oldin qavs ichida berilgan qiymat qaysi turdagi bo'lishi kerakligi ko'rsatilgan:
1
2
3
int a = 4;
int b = 6;
byte c = (byte)(a+b);
Kompilyator kichikroq bit kengligi bo'lgan turdan kattaroq bit kengligiga ega bo'lgan turga kengaytiruvchi konvertatsiyalarni amalga oshiradi. Bu quyidagi transformatsiyalar zanjiri bo'lishi mumkin:
bayt -> short -> int -> long -> decimal
int -> double
short -> float -> double
char -> int
Barcha xavfsiz avtomatik konvertatsiyalarni quyidagi jadvalda tasvirlash mumkin:
5.1-jadval
Turi
Qaysi turlarga xavfsiz tarzda aylantirilishi mumkin
Aks holda, aniq turdagi konversiyalardan foydalanish kerak.
Shuni ham ta'kidlash kerakki, ikkilik va o'nlik kasr ma'lumotlarini saqlashi mumkin va o'nlik ikki barobardan kattaroq bit chuqurligiga ega bo'lishiga qaramay, siz baribir ikkilamchi qiymatni o'nlik kasr turiga aniq o'tkazishingiz kerak:
1
2
double a = 4.0;
decimal b = (decimal)a;
Ma'lumotlar yo'qolishi va tekshirilgan kalit so'z
Boshqa vaziyatni ko'rib chiqing, masalan, quyidagi holatda bo'ladi:
1
2
3
4
int a = 33;
int b = 600;
byte c = (byte)(a+b);
Console.WriteLine(c); // 121
Natijada 121 bo'ladi, shuning uchun 633 bayt turi uchun diapazondan tashqarida va yuqori bitlar kesiladi. Natijada 121 raqami bo'ladi. Shuning uchun konvertatsiya qilishda buni hisobga olish kerak. Va bu holda, biz jami 255 dan ko'p bo'lmagan raqamni beradigan a va b raqamlarini olishimiz mumkin yoki biz bayt o'rniga boshqa ma'lumot turini tanlashimiz mumkin, masalan, int. Biroq, vaziyatlar boshqacha bo'lishi mumkin. Biz a va b qiymatlari qanday bo'lishini aniq bilmasligimiz mumkin. Va bunday vaziyatlardan qochish uchun C# da kalit so'z mavjud checked:
1
2
3
4
5
6
7
8
9
10
11
try
{
int a = 33;
int b = 600;
byte c = checked((byte)(a + b));
Console.WriteLine(c);
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
Kalit so'zdan foydalanganda, checkeddastur to'lib-toshgan istisnoni chiqaradi. Shuning uchun, bu holda, try...catch konstruktsiyasi uni qayta ishlash uchun ishlatiladi. Biz ushbu konstruksiya va istisno holatlarini keyinroq batafsil ko‘rib chiqamiz, ammo hozircha biz bilishimiz kerakki, biz try blokida xatolik yuzaga kelishi mumkin bo‘lgan harakatlarni o‘z ichiga olamiz va xatoni catch blokida hal qilish mumkin.
5.1.-rasm Tiplarni oshkor bo‘lmagan arifmetik o‘zgartirish ketma-ketligi.
O’zlashtirish uchun savollar.
Turlarning ahamiyati