CodeGym /Kurslar /Java SELF AZ /Java-da Tipləri Çevirmək

Java-da Tipləri Çevirmək

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Tiplərin çevrilməsi

Java-da tiplərin çevrilməsi

Primtiv tiplərdəki dəyişənlər (boolean istisna olmaqla) müxtəlif növ rəqəmləri saxlamaq üçün istifadə olunur. Hərçənd dəyişənlərin tipləri həmişə eyni qalır, amma tiplərin çevrilməsi həyata keçirilə biləcək bir yer var. Bu yer mənimsəmədir.

Fərqli tiplərdəki dəyişənləri bir-birinə mənimsətmək mümkündür. Bu halda bir tipdən olan dəyişəndən alınmış dəyər başqa bir tipin dəyərinə çevriləcək və ikinci dəyişənə təyin olunacaq. Bununla əlaqədar olaraq iki növ çevrilmə qeyd etmək olar: genişləndirmə və daraltma.

Tipin genişləndirilməsi kiçik səbətdən böyük səbətə köçürməyə bənzəyir — bu əməliyyat heç bir problem olmadan və sakitcə həyata keçirilir. Tipin daraldılması isə böyük səbətdən kiçik səbətə köçürməyə bənzəyir: yer çatmaya bilər və bir şeydən imtina etmək lazım gələ bilər.

“Səbətlərin” böyüklüyünə görə sıralanmış tiplər budur:

Java-da tiplərin çevrilməsi 2


2. Növlərin genişləndirilməsi

Tez-tez bir növün dəyişəninə başqa növün dəyişən dəyərini ötürmək lazım olur. Bəs bunu necə etmək olar?

Java-da 4 tam növ var:

Tip Ölçü
byte 1 bayt
short 2 bayt
int 4 bayt
long 8 bayt

Həmişə daha böyük ölçüyə malik dəyişənə daha kiçik ölçüyə malik dəyişənlər ötürülə bilər.

long tipli dəyişənə rahatlıqla int, shortbyte tipli dəyişənlər ötürülə bilər. int tipli dəyişənə shortbyte tipli dəyişənlər ötürülə bilər. Həmçinin, short tipli dəyişənə byte tipli dəyişənlər ötürülə bilər.

Nümunələr:

Kod Açıqlama
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
Bu kod rahatlıqla kompilyasiya olunacaq.

Bu cür dəyişiklik, kiçik ölçüdən daha böyük ölçüyə keçid, tipin genişləndirilməsi adlanır.

Bəs onluq nömrələr haqqında nə demək olar?

Onlarla hər şey bənzərdir — ölçünün əhəmiyyəti var:

Tip Ölçü
float 4 bayt
double 8 bayt

Bir double dəyişəninə float tipli dəyişən problemsiz ötürülə bilər. Amma tam növlərlə vəziyyət bir az maraqlıdır.

float tipli dəyişənə hər hansı bir tam növün dəyişəni ötürülə bilər. Hətta 8 bayt uzunluğu olan long tipli dəyişən belə. Amma double tipli dəyişənə hər şey ötürülə bilər: istənilən tam növlü dəyişən və float tipli dəyişən:

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

b == 1.23456794E9
c == 1.23456789E9

Diqqət edin ki, onluq növə keçid zamanı rəqəmlərin yetərsizliyi səbəbindən dəqiqlik itə bilər.

Tam növlərdən onluq növlərə keçid zamanı ən kiçik hissələr atıla bilər. Amma bu, onluq ədədi təqribi dəyəri saxlamaq üçün istifadə etmək niyyəti olduğundan, belə keçidə icazə verilir.


3. Tiplərin Əksildilməsi

Bəs qalan hallarda nə etmək lazımdır? Məsələn, bir int tipində dəyişənə long tipində bir dəyişənin dəyərini yazmaq lazımdırsa nə etməli?

Təsəvvür edin ki, dəyişən bir səbətdir. Bizdə fərqli ölçülərdə səbətlər var: 1, 2, 4 və 8 bayt. Kiçik səbətdən böyük səbətə köçürməkdə problem olmayacaq. Amma böyük səbətdən kiçik səbətə köçürərkən bəzi hissələr itə bilər.

Bu çevrilmə — böyük ölçülü tipdən kiçik ölçülü tipə keçid — tiplərin əksildilməsi adlanır. Belə bir təyinetmədə rəqəmin bir hissəsi yeni dəyişənə yerləşməyə bilər və "kənarda qala bilər".

Tiplərin əksildilməsi zamanı kompilyatora göstərməliyik ki, bu bizim bilərəkdən etdiyimiz bir seçimdir və bu, tamamilə şüurlu bir hərəkətdir. Bunun üçün tip çevrilmə operatorundan istifadə edilir. Bu isə tipin adı dairəvi mötərizələrdə yazılmasıdır.

Belə hallarda Java kompilyatoru proqramçıdan tip çevrilmə operatorunu göstərməyi tələb edir. Ümumi şəkildə belə görünür:

(tip) ifadə

Nümunələr:

Kod Təsvir
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
Hər dəfə tip çevrilmə operatorunu mütləq göstərmək lazımdır

Bu halda a 1-ə bərabərdir, bu isə artıq görünə bilər. Bəs, əgər a daha böyük olsaydı?

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

Milyon həm long, həm də int tipinə asanlıqla yerləşir. Amma milyon short tipinə təyin edildikdə ilk iki bayt atılır və sadəcə son iki bayt qalır. byte tipinə təyin edildikdə isə yalnız bir dənə son bayt qalır.

Rəqəmlərin yaddaşda quruluşu:

Tip İkilik qeyd Onluq qeyd
int 0b00000000000011110100001001000000 1,000,000
short 0b0100001001000000 16,960
byte 0b01000000 64

char Tipi

char tipi, short tipi kimi, iki baytdır, amma bunların bir-birinə çevrilməsində həmişə tip çevrilmə operatoru istifadə edilməlidir. Fərq ondadır ki, short tipi işarəlidir və -32,768-dən +32,767-yə qədər dəyərləri saxlayır, char tipi isə işarəsizdir və 0-dan 65,535-ə qədər dəyərləri saxlayır.

char-da short-da ola biləcək mənfi dəyərlər saxlanıla bilməz. Eyni zamanda, short-da char-da ola biləcək 32,767-dən böyük dəyərlər saxlanıla bilməz.


4. İfadənin tipi

Bəs nə etməliyik, əgər bir ifadədə müxtəlif tiplərdə olan dəyişənlər istifadə edilirsə? Məntiqli cavab – onları əvvəlcə ümumi bir tipə çevirməkdir. Amma hansı?

Əlbəttə ki, daha böyük olana.

Java-da həmişə daha geniş ölçülü bir tipə çevrilmə baş verir. Sadə dillə desək, əməliyyat iştirakçılarından birinin tipi böyüdülür, ardından isə eyni tipdəki dəyərlərlə əməliyyat aparılır.

Əgər ifadədə intlong tipləri iştirak edirsə, int tipində olan dəyər long tipinə çevriləcək, yalnız bundan sonra əməliyyatda iştirak edəcək:

Kod Təsviri
int a = 1;
long b = 2;
long c = a + b;
a əvvəlcə long tipinə çevriləcək, yalnız sonra toplama əməliyyatı baş tutacaq.

Üzən nöqtəli ədədlər

Əgər ifadədə tam ədəd və üzən nöqtəli ədəd (float/double) iştirak edirsə, tam ədəd üzən nöqtəli ədədə çevriləcək (float/double) və yalnız bundan sonra əməliyyat yerinə yetiriləcək.

Əgər əməliyyatda floatdouble iştirak edirsə, float double-a çevriləcək. Bu isə gözlənilən bir şeydir.

Sürpriz

byte, short, char tipləri bir-birilə qarşılıqlı əlaqədə olduqda həmişə int tipinə çevrilir. Boşuna deyil ki, int tip standart tam ədəd tipi sayılır.

Əgər byteshort-a vurarsanız, nəticə int olacaq. Əgər bytebyte-a vurarsanız, nəticə int olacaq. Hətta byte ilə byte toplasanız belə, nəticə int olacaq.

Bunun bir neçə səbəbi var. Misallar:

Kod Təsviri
byte a = 110;
byte b = 120;
byte c = a * b;   // xətaya səbəb olur
110 * 120 olacaq 13,200, bu isə byte tipinin maksimum dəyərindən böyükdür: 127
byte a = 110;
byte b = 120;
byte c = a + b;   // xətaya səbəb olur
110 + 120 olacaq 230, bu da byte tipinin maksimum dəyərindən böyükdür: 127

Ümumiyyətlə, 8 bitlik (1 bayt) uzunluğunda olan bir ədədi digər 8 bitlik (1 bayt) uzunluğunda olan bir ədədə vurduqda, 16 bitlik (2 bayt) uzunluğunda bir ədəd əldə edirik.

Buna görə də, int-dən kiçik olan tam ədədlər ilə əməliyyatlar həmişə birbaşa int tipinə çevrilir. Buna görə də, əgər hesablamanın nəticəsini int-dən kiçik bir tipe saxlamaq istəyirsinizsə, həmişə açıq şəkildə tip çevirmə əməliyyatını göstərməli olacaqsınız.

Misallar:

Kod Təsviri
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
ifadə byte * byte tipi int olacaq
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
ifadə byte + byte tipi int olacaq
byte a = 1;
byte b = (byte) (a + 1);
ifadə byte + int tipi int olacaq
bir vahid – bu int tipli literaldır.

5. Vacib məqam

Tip çevrilməsi əməliyyatı olduqca yüksək üstünlüyə malikdir.

Bu səbəbdən, ifadədə, məsələn, toplama və tip çevrilməsi əməliyyatı varsa, tip çevrilməsi toplama əməliyyatından əvvəl icra ediləcək.

Nümunə:

Kod Təsvir
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
Tip çevrilməsi operatoru yalnız a dəyişəninə tətbiq olunur, hansı ki, onsuz da byte tipindədir. Kod tərtib edilməyəcək.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
Bu cür düzgün olur.

Bütün ifadəni müəyyən bir tipə çevirmək istəyirsinizsə, yalnız bir elementini deyil, bütün ifadəni dairəvi mötərizələrə alın və onların qarşısında tip çevrilməsi operatorunu qoyun.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION