Algoritmik tillar va dasturlash. Ma’ruza mashg’ulotlari uchun o’quv qo’llanma. X. E. Xolmirzayev, M. N. Ikromova, M. M. Bahromova Annotatsiya


Toraytiruvchi va kengaytiruvchi transformatsiyalar



Yüklə 2,87 Mb.
səhifə18/56
tarix19.12.2023
ölçüsü2,87 Mb.
#184841
1   ...   14   15   16   17   18   19   20   21   ...   56
O`quv qo`llanma11 (2)

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

bayt

short, ushort, int, uint, long, ulong, float, double, kasr

sbyte

short, int, long, float, double, decimal

short

int, long, float, double, decimal

ushort

int, uint, long, ulong, float, double, decimal

int

long, float, double, decimal

uint

long, ulong, float, double, decimal

long

float, double, decimal

ulong

float, double, decimal

float

Double

char

ushort, int, uint, long, ulong, float, double, decimal


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.

  1. Turlarning ahamiyati

  2. Transformatsiyalashning qanday usullari mavjud?

  3. Konvertatsiya qilish usullari

  4. Aniq konvertatsiyalar qanday amalga oshiriladi?

  5. Yashirin konvertatsiyalar qanday amalga oshiriladi?

Yüklə 2,87 Mb.

Dostları ilə paylaş:
1   ...   14   15   16   17   18   19   20   21   ...   56




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin