1. 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:
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
, short
və byte
tipli dəyişənlər ötürülə bilər. int
tipli dəyişənə short
və byte
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 |
---|---|
|
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 |
---|---|
|
|
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 |
---|---|
|
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 |
---|---|
|
|
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ə int
və long
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 |
---|---|
|
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 float
və double
iştirak edirsə, float
double
-a çevriləcək. Bu isə gözlənilən bir şeydir.
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 byte
-ı short
-a vurarsanız, nəticə int
olacaq. Əgər byte
-ı byte
-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 |
---|---|
|
110 * 120 olacaq 13,200 , bu isə byte tipinin maksimum dəyərindən böyükdür: 127 |
|
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 |
---|---|
|
ifadə byte * byte tipi int olacaq |
|
ifadə byte + byte tipi int olacaq |
|
ifadə byte + int tipi int olacaqbir 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 |
---|---|
|
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. |
|
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.
GO TO FULL VERSION