JavaRush /Java Blogu /Random-AZ /Java-da primitiv növlərin dökümü (çevrilməsi).

Java-da primitiv növlərin dökümü (çevrilməsi).

Qrupda dərc edilmişdir
Salam! JavaRush-dan keçərkən primitiv tiplərə bir dəfədən çox rast gəldiniz. Onlar haqqında bildiklərimizin qısa siyahısı:
  1. Onlar obyekt deyillər və yaddaşda saxlanılan dəyəri təmsil edirlər
  2. Primitiv növlərin bir neçə növü var:
    • Tam ədədlər - byte, short, int,long
    • Üzən nöqtəli ədədlər (kəsir) - floatdouble
    • Boolean -boolean
    • Simvolik (hərfləri və rəqəmləri göstərmək üçün) -char
  3. Onların hər birinin öz dəyər diapazonu var:
Primitiv tip Yaddaşdakı ölçü Dəyərlər diapazonu
bayt 8 bit -128-dən 127-yə qədər
qısa 16 bit -32768-dən 32767-ə qədər
char 16 bit 0-dan 65536-a qədər
int 32 bit -2147483648-dən 2147483647-yə qədər
uzun 64 bit -9223372036854775808-dən 9223372036854775807-ə qədər
sal 32 bit (2-dən gücə -149) ((2-2 gücə -23)*2 gücə 127)
ikiqat 64 bit (-2-dən 63-ün gücünə) ((2-nin 63-ün gücünə) - 1)
boolean 8 (massivlərdə istifadə edildikdə), 32 (qeyri massivlərdə istifadə edildikdə) doğru və ya yanlış
Lakin, dəyərlərə əlavə olaraq, növlər yaddaş ölçüsündə də fərqlənir. int-dən çox alır byte. A long- daha çox short. Primitivlərin tutduğu yaddaşın miqdarını yuva quran kuklalarla müqayisə etmək olar: İbtidai növlərin genişlənməsi və daralması - 2 Yuva quran kuklanın içərisində boş yer var. Yuva quran kukla nə qədər böyükdürsə, bir o qədər çox yer olur. Böyük bir yuva kuklasının içərisinə longdaha kiçik olanı asanlıqla yerləşdirə bilərik int. Asanlıqla uyğun gəlir və əlavə bir şey etmək lazım deyil. Java-da primitivlərlə işləyərkən buna avtomatik çevrilmə deyilir. Başqa bir şəkildə buna uzantı deyilir. Budur sadə bir uzantı nümunəsi:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byteBurada dəyişənə dəyər təyin edirik int. Tapşırıq uğurlu və heç bir problem olmadan həyata keçirildi: yaddaşda saxlanılan dəyər byte"uyğun" olduğundan daha az yaddaş yeri tutur int. "Kiçik yuva kuklası" (dəyər byte) asanlıqla "böyük matryoshka"ya (dəyişən int) uyğun gəlir. Bunun əksini etməyə çalışdığınız zaman başqa məsələdir - bu cür ölçülər üçün nəzərdə tutulmayan dəyişənə böyük bir dəyər qoyun. Prinsipcə, bu hiylə əsl yuva kuklaları ilə işləməyəcək, lakin Java-da işləyəcək, lakin nüanslarla. intGəlin dəyişənə dəyər qoymağa çalışaq short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Xəta! Kompilyator başa düşür ki, siz qeyri-standart bir şey etməyə çalışırsınız və intkiçik bir ( ) içərisinə böyük bir matryoshka kuklasını ( ) qoyun short. Bu vəziyyətdə kompilyasiya xətası tərtibçinin xəbərdarlığıdır: “ Hey, bunu etmək istədiyinizə əminsinizmi? “Əminsinizsə, tərtibçiyə bu barədə deyin: “ Hər şey qaydasındadır, mən nə etdiyimi bilirəm!” ” Bu proses açıq tip çevrilmə və ya daralma adlanır . Daraltmaq üçün dəyərinizi hansı növə aid etmək istədiyinizi açıq şəkildə göstərməlisiniz. Başqa sözlə, tərtibçinin sualına cavab verin: " Yaxşı, bu böyük kuklalardan hansını qoymaq istəyirsən?" ” Bizim vəziyyətimizdə bu belə görünəcək:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
intDəyəri dəyişənə uyğunlaşdırmaq shortvə bunun üçün məsuliyyət daşımaq istədiyimizi açıq şəkildə bildirdik . Kompilyator, daha dar bir növün açıq bir göstəricisini görərək, bir çevrilmə həyata keçirir. Nəticə nə olacaq? Konsol çıxışı: -27008 Bir az gözlənilməz oldu. Niyə məhz belə? Əslində sadədir. intBizim orijinal dəyərimiz var idi - 10000000 O , 32 bit tutan dəyişəndə ​​saxlanılırdı və ikili formada belə görünürdü: Расширение и сужение примитивных типов - 3 Biz bu dəyəri dəyişənə yazırıq short, lakin o, yalnız 16 bit saxlaya bilir! Müvafiq olaraq, nömrəmizin yalnız ilk 16 biti ora köçürüləcək, qalanları atılacaq. Nəticədə, dəyişən ondalıq formada -27008-ə tam bərabər olan shortdəyəri ehtiva edəcəkdir . Расширение и сужение примитивных типов - 4Birincisi, bu, nəticə üçün məsuliyyət daşıdığınızı göstərir, ikincisi, tipləri tökərkən kompilyatora nə qədər yer ayırmaq lazım olduğunu bildirir. Axı, əgər sonuncu misalda --a yox, inttype -a köçürsək , bizim ixtiyarımızda 16 deyil, cəmi 8 bit olardı və nəticə fərqli olardı. Kəsrə növlər ( və ) üçün daralma fərqli şəkildə baş verir. Əgər belə bir ədədi tam ədədə çevirməyə cəhd etsəniz, onun kəsr hissəsi atılacaq. byteshortfloatdouble
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Konsol çıxışı: 2

Məlumat növü char

Siz artıq bilirsiniz ki, char tipi fərdi simvolları göstərmək üçün istifadə olunur.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
Ancaq başa düşmək üçün vacib olan bir sıra xüsusiyyətlərə malikdir. Qiymət diapazonu olan cədvələ yenidən baxaq:
Primitiv tip Yaddaşdakı ölçü Dəyərlər diapazonu
bayt 8 bit -128-dən 127-yə qədər
qısa 16 bit -32768-dən 32767-yə qədər
char 16 bit 0-dan 65536-a qədər
int 32 bit -2147483648-dən 2147483647-yə qədər
uzun 64 bit -9223372036854775808-dən 9223372036854775807-ə qədər
sal 32 bit (2-dən gücə -149) ((2-2 gücə -23)*2 gücə 127)
ikiqat 64 bit (-2-dən 63-ün gücünə) ((2-nin 63-ün gücünə)-1)
boolean 8 (massivlərdə istifadə edildikdə), 32 (qeyri massivlərdə istifadə edildikdə) doğru və ya yanlış
Növün char0-dan 65536-a qədər rəqəmli diapazonu var. Bəs bu nə deməkdir? Axı charbunlar təkcə rəqəmlər deyil, həm də hərflər, durğu işarələridir... Fakt budur ki, dəyərlər charJava-da Unicode formatında saxlanılır. Unicode ilə əvvəlki mühazirələrdən birində artıq rastlaşmışıq. Yəqin xatırlayırsınız ki, Unicode dünyanın demək olar ki, bütün yazılı dillərindən simvolları ehtiva edən simvol kodlaşdırma standartıdır. Başqa sözlə, bu, hər hansı bir dildən demək olar ki, hər hansı bir simvol üçün kodun olduğu xüsusi kodların siyahısıdır. Ümumi Unicode cədvəli çox böyükdür və təbii ki, əzbər öyrənməyə ehtiyac yoxdur. Burada, məsələn, onun bir hissəsidir: Расширение и сужение примитивных типов - 5 Əsas odur ki, dəyərlərin saxlanması prinsipini başa düşmək charvə yadda saxlamaq lazımdır ki , müəyyən bir simvolun kodunu bilməklə onu həmişə proqramda əldə edə bilərsiniz. Gəlin bunu təsadüfi nömrə ilə sınayaq:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Konsol çıxışı: 耰 Bu simvolların Java-da saxlandığı formatdır char. Hər bir simvol bir nömrəyə uyğun gəlir - 16 bitlik rəqəmsal kod və ya iki bayt. Unicode 32816 耰 simvoluna uyğundur. Bu məqama diqqət yetirin. Bu nümunədə dəyişəndən istifadə etdik int. 32 bit yaddaş tutur , char16 bit . Bizə lazım olan 32816 nömrə diapazondan kənarda olduğu üçün burada seçdik . Ölçüsü , qısa olduğu kimi, 16 bit olsa da, diapazonda mənfi rəqəmlər yoxdur, buna görə də "müsbət" diapazon iki dəfə böyükdür (32767 əvəzinə 65536 ). Kodumuz 65536 diapazonuna düşdüyü müddətcə istifadə edə bilərik . Amma bir ədəd yaratsaq , o, 16 bitdən çox tutacaq. Və növləri daraldarkən: intshortcharcharcharshortintint >65536
char c = (char) x;
əlavə bitlər atılacaq və nəticə olduqca gözlənilməz olacaq.

Xarakter və tam ədədlərin əlavə edilməsi xüsusiyyətləri

Bu qeyri-adi misala baxaq:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Konsol çıxışı: 50 O_O Məntiq haradadır? 1+1, 50 haradan gəldi?! Artıq bilirsiniz ki, dəyərlər charyaddaşda simvolumuzun Unicode kodunu təmsil edən 0-dan 65536-a qədər rəqəmlər şəklində saxlanılır. Расширение и сужение примитивных типов - 6 Beləliklə, budur. Əlavə etdikdə charvə bəzi tam ədədlər charUnicode-da ona uyğun gələn ədədə çevrilir. Kodumuza 1 və '1' əlavə etdikdə, '1' simvolu onun koduna çevrildi, bu 49 (yuxarıdakı cədvəldə yoxlaya bilərsiniz). Beləliklə, nəticə 50-yə bərabər oldu. Gəlin bir daha köhnə dostumuzu -misal götürək və onu hansısa rəqəmlə əlavə etməyə çalışaq.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
Konsolun çıxışı: 33016 Artıq müəyyən etdik ki,32816 koduna uyğun gəlir. Və bu rəqəmi və 200-ü əlavə etdikdə tam olaraq nəticəmizi alırıq - 33016 :) İş mexanizmi, gördüyünüz kimi, olduqca sadədir.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION