JavaRush /Java блогы /Random-KK /Java тіліндегі қарабайыр типтерді трансляциялау (түрленді...

Java тіліндегі қарабайыр типтерді трансляциялау (түрлендіру).

Топта жарияланған
Сәлеметсіз бе! JavaRush арқылы өтіп жатқанда, сіз қарабайыр типтерді бірнеше рет кездестірдіңіз. Міне, олар туралы білетін нәрселердің қысқаша тізімі:
  1. Олар an objectілер емес және жадта сақталған мәнді білдіреді
  2. Қарапайым түрлердің бірнеше түрлері бар:
    • Бүтін сандар - byte, short, int,long
    • Жылжымалы нүкте сандары (бөлшек) - floatжәнеdouble
    • логикалық -boolean
    • Символдық (әріптер мен сандарды көрсету үшін) -char
  3. Олардың әрқайсысының өзіндік мәндер ауқымы бар:
Қарапайым тип Жадтағы өлшем Мәндер ауқымы
byte 8 бит -128-ден 127-ге дейін
қысқа 16 бит -32768-ден 32767-ге дейін
таңба 16 бит 0-ден 65536-ға дейін
int 32 бит -2147483648-ден 2147483647-ге дейін
ұзақ 64 бит -9223372036854775808 бастап 9223372036854775807 дейін
жүзу 32 бит (2-ден қуатқа -149) дейін ((2-2 қуатқа -23)*2 қуатқа 127)
қос 64 бит (-2-ден 63-тің дәрежесіне) ((2-нің 63-тің дәрежесі) - 1)
логикалық 8 (массивтерде пайдаланылғанда), 32 (массив еместерде пайдаланылғанда) шын немесе жалған
Бірақ мәндерден басқа, типтер жад көлемі бойынша да ерекшеленеді. intастам алады byte. A long- артық short. Примитивтер алатын жады көлемін ұя салатын қуыршақтармен салыстыруға болады: Қарапайым типтердің кеңеюі мен тарылуы – 2 ұя салатын қуыршақтың ішінде бос орын бар. Ұя салатын қуыршақ неғұрлым үлкен болса, соғұрлым көбірек орын болады. Біз үлкен ұя салатын қуыршақтың ішіне longкішірекін оңай сала аламыз int. Бұл оңай сәйкес келеді және сізге қосымша ештеңе жасаудың қажеті жоқ. Java тілінде примитивтермен жұмыс істегенде бұл автоматты түрлендіру деп аталады. Басқа жолмен ол кеңейтім деп аталады. Міне қарапайым кеңейтім мысалы:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byteМұнда айнымалыға мән береміз int. Тапсырма сәтті және еш қиындықсыз орындалды: ішінде сақталған мән byteжадта «сәйкестендірілгеннен» азырақ орын алады int. «Ұя салатын кішкентай қуыршақ» (мән byte) «үлкен матрешкаға» (айнымалы int) оңай сәйкес келеді. Керісінше әрекет еткенде, бұл басқа мәселе - мұндай өлшемдерге арналмаған айнымалыға үлкен мән қойыңыз. Негізінде, бұл трюк нақты ұя салатын қуыршақтармен жұмыс істемейді, бірақ Java-да ол жұмыс істейді, бірақ нюанстармен. intАйнымалыға мән енгізуге тырысайық short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Қате! Компилятор стандартты емес нәрсе жасауға тырысып жатқаныңызды түсінеді және үлкен матрешка қуыршағын ( int) кішкентайдың ( short) ішіне қойыңыз. Бұл жағдайда компиляция қатесі компилятордың ескертуі болып табылады: « Эй, сіз мұны шынымен орындағыңыз келе ме? «Егер сенімді болсаңыз, бұл туралы компиляторға айтыңыз: « Бәрі жақсы, мен не істеп жатқанымды білемін!» ” Бұл процесс анық түр түрлендіру немесе тарылту деп аталады . Тарту жасау үшін мәнді аударғыңыз келетін түрді нақты көрсетуіңіз керек. Басқаша айтқанда, құрастырушының сұрағына жауап беріңіз: « Ал, осы үлкен қуыршақтардың қайсысына салғың келеді?» ” Біздің жағдайда ол келесідей болады:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
intБіз мәнді айнымалыға сәйкестендіруді shortжәне ол үшін жауапкершілікті алғымыз келетінін анық көрсеттік . Құрастырушы тар түрдің айқын көрсеткішін көріп, түрлендіруді орындайды. Нәтиже қандай болады? Консоль шығысы: -27008 Біраз күтпеген. Неліктен дәл осылай? Бұл шын мәнінде қарапайым. intБізде бастапқы мән болды - 10000000 Ол 32 бит алатын айнымалыда сақталды , ал екілік түрде ол келесідей болды: Қарапайым типтердің кеңеюі мен тарылуы – 3 Біз бұл мәнді айнымалыға жазамыз short, бірақ ол тек 16 бит сақтай алады! Тиісінше, біздің нөміріміздің алғашқы 16 биті ғана сонда жылжытылады, қалғандары жойылады. Нәтижесінде, айнымалы shortмәнді қамтиды Қарапайым типтердің кеңеюі мен тарылуы – 4, ондық түрінде дәл -27008-ге тең, сондықтан компилятор белгілі бір түрге анық трансляция түрінде «растауды сұрады». Біріншіден, бұл нәтиже үшін жауапкершілікті өз мойнына алатыныңызды көрсетеді, екіншіден, түрлерді шығару кезінде компиляторға қанша орын бөлу керектігін айтады. Ақыр соңында, егер біз соңғы мысалда -ға емес, inttype -ге көшкен болсақ , біздің иелікте 16 емес, тек 8 бит болады және нәтиже басқаша болар еді. Бөлшек түрлері ( және ) үшін тарылу басқаша жүреді. Егер мұндай санды бүтін түрге түрлендіруге әрекет жасасаңыз, оның бөлшек бөлігі жойылады. byteshortfloatdouble
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Консоль шығысы: 2

Деректер түрі char

Сіз char түрі жеке таңбаларды көрсету үшін қолданылатынын білесіз.
public static void main(String[] args) {

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

}
Бірақ оның түсіну үшін маңызды бірқатар ерекшеліктері бар. Мән диапазондары бар кестені қайта қарастырайық:
Қарапайым тип Жадтағы өлшем Мәндер ауқымы
byte 8 бит -128-ден 127-ге дейін
қысқа 16 бит -32768-ден 32767-ге дейін
таңба 16 бит 0-ден 65536-ға дейін
int 32 бит -2147483648-ден 2147483647-ге дейін
ұзақ 64 бит -9223372036854775808 бастап 9223372036854775807 дейін
жүзу 32 бит (2-ден қуатқа -149) дейін ((2-2 қуатқа -23)*2 қуатқа 127)
қос 64 бит (-2-ден 63-тің дәрежесіне) ((2-нің 63-тің дәрежесі)-1)
логикалық 8 (массивтерде пайдаланылғанда), 32 (массив еместерде пайдаланылғанда) шын немесе жалған
Түрдің char0-ден 65536-ға дейінгі сандық диапазоны бар. Бірақ бұл нені білдіреді? Өйткені, charбұл сандар ғана емес, әріптер, тыныс белгілері де... Мәндер charJava тілінде Юниcode форматында сақталады. Біз Юниcodeты алдыңғы лекциялардың бірінде кездестірдік. Юниcode - әлемнің барлық дерлік жазба тілдеріндегі таңбаларды қамтитын таңбаларды codeтау стандарты екенін есте ұстаған шығарсыз . Басқаша айтқанда, бұл кез келген тілдегі кез келген таңбаның codeы бар арнайы codeтардың тізімі. Жалпы Юниcode кестесі өте үлкен және, әрине, жатқа үйренудің қажеті жоқ. Міне, мысалы, оның бір бөлігі: Қарапайым типтердің кеңеюі мен тарылуы – 5 Ең бастысы - мәндерді сақтау принципін түсіну charжәне белгілі бір таңбаның codeын біле отырып, оны әрқашан бағдарламада алуға болатынын есте сақтаңыз. Мұны кездейсоқ санмен қолданып көрейік:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Консоль шығысы: 耰 Бұл Java тілінде таңбалар сақталатын пішім char. Әрбір таңба санға сәйкес келеді - 16 биттік сандық code немесе екі byte. Юниcode 32816 耰 таңбасына сәйкес келеді. Осы сәтке назар аударыңыз. Бұл мысалда біз айнымалыны қолдандық int. Ол 32 бит жадты алады , ал char16 . Мұнда біз таңдадық , себебі бізге қажет нөмір 32816 ауқымнан тыс . Өлшем қысқа сияқты 16 бит болса да, ауқымда теріс сандар жоқ, сондықтан «оң» диапазон екі есе үлкен (32767 орнына 65536 ). Біздің codeымыз 65536 ауқымында болған кезде біз пайдалана аламыз . Бірақ егер санды жасасақ , ол 16 биттен көп орын алады. Ал түрлерін тарылтқанда: intshortcharcharcharshortintint >65536
char c = (char) x;
қосымша биттер жойылады және нәтиже күтпеген болады.

Символ және бүтін сандарды қосу ерекшеліктері

Осы ерекше мысалды қарастырайық:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Консоль шығысы: 50 O_O Логика қайда? 1+1, 50 қайдан шықты?! charМәндер жадта 0-ден 65536-ға дейінгі диапазондағы сандар ретінде сақталатынын білесіз , бұл біздің кейіпкеріміздің Юниcodeын білдіреді. Қарапайым типтердің кеңеюі мен тарылуы – 6 Солай. Біз қосуды орындаған кезде charжәне кейбір бүтін тип charЮниcodeта оған сәйкес келетін санға түрлендіріледі. Біздің codeта 1 және '1' сандарын қосқанда, '1' символы оның codeына түрлендірілді, ол 49 (оны жоғарыдағы кестеде тексеруге болады). Сондықтан, нәтиже 50-ге тең болды. Мысал ретінде тағы да ескі досымыз -耰алайық және оны бірнеше санмен қосып көрейік.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Консоль шығысы: 33016 Біз耰32816 codeына сәйкес келетінін білдік. Осы сан мен 200-ді қосқанда, біз дәл нәтиже аламыз - 33016 :) Жұмыс істеу механизмі, көріп отырғаныңыздай, өте қарапайым.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION