JavaRush /Java блогу /Random-KY /Javaдагы примитивдүү типтерди кастинг (конвертациялоо).

Javaдагы примитивдүү типтерди кастинг (конвертациялоо).

Группада жарыяланган
Салам! JavaRush аркылуу өтүп жатып, сиз примитивдик типтерге бир нече жолу туш болдуңуз. Бул жерде биз алар жөнүндө билгендердин кыскача тизмеси:
  1. Алар an object эмес жана эстутумда сакталган маанини билдирет
  2. Примитивдүү түрлөрүнүн бир нече түрлөрү бар:
    • Бүтүн сандар - byte, short, int,long
    • Калкыма чекиттик сандар (бөлчөк) - floatжанаdouble
    • логикалык -boolean
    • Символикалык (тамгаларды жана сандарды көрсөтүү үчүн) -char
  3. Алардын ар бири баалуулуктардын өз диапазону бар:
Примитивдик түрү Эс тутумдагы өлчөмү Маанилердин диапазону
byte 8 бит -128ден 127ге чейин
кыска 16 бит -32768ден 32767ге чейин
char 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 тorнде примитивдер менен иштөөдө бул автоматтык конвертация деп аталат. Башка жол менен ал кеңейтүү деп аталат. Бул жерде жөнөкөй кеңейтүү мисал:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byteБул жерде биз өзгөрмөгө маани беребиз int. Тапшырма ийгorктүү жана эч кандай көйгөйсүз өттү: сакталган маани эстутумда 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, ал үчүн жоопкерчorкти алгыбыз келет деп ачык айттык . Компилятор тар типтин ачык белгисин көрүп, конversionны ишке ашырат. Жыйынтыгы кандай болот? Консолдун чыгышы: -27008 Бир аз күтүүсүз. Эмне үчүн так ушундай? Бул чындыгында жөнөкөй. intБизде баштапкы маани бар болчу - 10000000 Ал 32 битти ээлеген өзгөрмөдө сакталган жана бинардык формада мындай көрүндү: Примитивдүү типтердин кеңейиши жана кыскарышы - 3 Биз бул маанини өзгөрмөгө жазабыз short, бирок ал 16 битти гана сактай алат! Тиешелүү түрдө биздин номердин алгачкы 16 биттери гана ал жакка жылдырылат, калгандары жок кылынат. Натыйжада, өзгөрмө shortмаанини камтыйт Примитивдүү типтердин кеңейиши жана кыскарышы - 4, ондук формада так -27008ге барабар Мына ошондуктан компилятор белгилүү бир түргө ачык түрдө чыгаруу түрүндө "тастыктоо сурады". Биринчиден, бул натыйжа үчүн жоопкерчorкти өз мойнуңузга алып жатканыңызды көрсөтөт, экинчиден, типтерди чыгарууда компиляторго канча орун бөлүү керектигин айтат. Кантсе да, эгерде биз акыркы мисалда ге эмес, 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';

}
Бирок ал түшүнүү үчүн маанилүү болгон бир катар өзгөчөлүктөргө ээ. Келгиле, баалуулук диапазону менен tableны дагы бир жолу карап көрөлү:
Примитивдик түрү Эс тутумдагы өлчөмү Маанилердин диапазону
byte 8 бит -128ден 127ге чейин
кыска 16 бит -32768ден 32767ге чейин
char 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 tableсы абдан чоң жана, албетте, жатка үйрөнүүнүн кереги жок. Бул жерде, мисалы, анын бир бөлүгү болуп саналат: Примитивдүү типтердин кеңейиши жана кыскарышы - 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 ). Кодубуз 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 (сиз аны жогорудагы tableдан текшере аласыз). Ошентип, натыйжа 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