JavaRush /Блоги Java /Random-TG /Намудҳои ибтидоӣ (табдил додан) дар 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. А long- зиёда аз short. Миқдори хотираи ишғолкардаи ибтидоиро метавон бо лӯхтакҳои лона муқоиса кард: Васеъ ва ихтисоршавии навъњои ибтидої - 2 Дар дохor лӯхтак фазои холӣ мавҷуд аст. Чӣ қадаре ки лӯхтаки лона калонтар бошад, ҳамон қадар ҷой бештар мешавад. longМо метавонем ба осонӣ дар дохor лӯхтаки калони лона гузорем 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дар дохor як лӯхтаки матрешкаи калон ( ) гузоред ( short). Хатогии ҷамъоварӣ дар ин ҳолат огоҳии компилятор аст: " Ҳей, шумо мутмаин ҳастед, ки ин корро кардан мехоҳед? "Агар шумо боварӣ дошта бошед, ба тартибдиҳанда дар ин бора бигӯед:" Ҳама чиз хуб аст, ман медонам, ки чӣ кор карда истодаам! ” Ин раванд табдor навъи возеҳ ё танг номида мешавад . Барои танг кардан, шумо бояд ба таври возеҳ намудеро нишон диҳед, ки шумо мехоҳед арзиши худро ба он гузоред. Ба ибораи дигар, ба саволи мураттиб ҷавоб диҳед: " Хуб, шумо ин лӯхтаки калонро ба кадоме аз ин лӯхтакҳо гузоштан мехоҳед?" ” Дар ​​ҳолати мо он чунин хоҳад буд:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
Мо ба таври возеҳ нишон додем, ки мо мехоҳем арзишро intба тағирёбанда мувофиқ созем shortва барои он масъулиятро ба дӯш гирем. Компилятор нишонаи возеҳи навъи тангтарро дида, табдилро анҷом медиҳад. Оқибат чӣ мешавад? Натиҷаи консол: -27008 Каме ғайричашмдошт. Чаро маҳз ҳамин тавр? Ин дар асл оддӣ аст. Мо арзиши аслӣ доштем - 10000000 Он дар як тағирёбанда нигоҳ дошта шуд int, ки 32 битро ишғол мекард ва дар шакли бинарӣ чунин менамуд: Васеъ ва ихтисоршавии навъњои ибтидої - 3 Мо ин арзишро ба тағирёбанда менависем short, аммо он танҳо 16 битро нигоҳ дошта метавонад! Мувофиқи он, танҳо 16 битҳои аввали рақами мо ба он ҷо интиқол дода мешаванд, боқимонда партофта мешаванд. Дар натиҷа, тағирёбанда shortдорои арзиши Васеъ ва ихтисоршавии навъњои ибтидої - 4, ки дар шакли даҳӣ комилан ба -27008 баробар аст, дар бар мегирад, бинобар ин, компилятор "тасдиқро дархост кард" дар шакли як намуди мушаххас. Якум, ин нишон медиҳад, ки шумо барои натиҷа масъулият доред ва дуюм, он ба тартибдиҳанда мегӯяд, ки ҳангоми рехтани намудҳо чӣ қадар ҷой ҷудо кардан лозим аст. Охир, агар дар мисоли охирин мо intба type byte, на ба -ро меандохтем short, дар ихтиёри мо танҳо 8 бит мебуд, на 16 ва натиҷа дигар мешуд. Барои намудҳои касрӣ ( floatва double), тангшавӣ ба таври гуногун сурат мегирад. Агар шумо кӯшиш кунед, ки чунин ададро ба навъи бутун табдил диҳед, қисми касри он партофта мешавад.
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
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 (вақте ки дар массивҳо истифода намешаванд) рост ё дурӯғ
Навъи charрақамӣ аз 0 то 65536 дорад. Аммо ин чӣ маъно дорад? Дар ниҳоят, charинҳо на танҳо рақамҳо, балки ҳарфҳо, аломатҳои пунктуатсия мебошанд... Гап дар он аст, ки арзишҳо charдар Java дар формати Юниcode нигоҳ дошта мешаванд. Мо аллакай дар яке аз лексияҳои қаблӣ бо Юниcode дучор шуда будем. Шояд шумо дар хотир доред, ки Юниcode стандарти рамзгузории аломатҳост, ки аломатҳои қариб ҳамаи забонҳои хаттии ҷаҳонро дар бар мегирад. Ба ибораи дигар, ин рӯйхати рамзҳои махсусест, ки дар он рамзи қариб ҳар як аломат аз ҳар забон мавҷуд аст. Ҷадвали умумии Юниcode хеле калон аст ва, албатта, лозим нест, ки онро аз худ ёд гиред. Дар ин ҷо, масалан, як пораи он аст: Васеъ ва ихтисоршавии навъњои ибтидої - 5 Хӯроки асосӣ ин аст, ки фаҳмидани принсипи нигоҳдории арзишҳо char, ва дар хотир доред, ки донистани рамзи рамзи мушаххас, шумо ҳамеша метавонед онро дар барнома дастрас кунед. Биёед инро бо рақами тасодуфӣ санҷем:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Натиҷаи консол: 耰 Ин форматест, ки дар Java аломатҳо нигоҳ дошта мешаванд char. Ҳар як аломат ба рақам мувофиқ аст - рамзи ададии 16 бит ё ду byte. Юниcodeи 32816 ба аломати 耰 мувофиқат мекунад. Ба ин лаҳза диққат диҳед. Дар ин мисол мо тағирёбандаро истифода мебарем int. Он 32 бит хотираро ишғол мекунад , дар ҳоле ки char16 бит . Дар ин ҷо мо интихоб кардем , зеро рақами ба мо лозим 32816 аз доираи диапазон берун аст . Ҳарчанд андозаи , мисли кӯтоҳ, 16 бит аст, дар диапазон рақамҳои манфӣ вуҷуд надоранд, аз ин рӯ диапазони "мусбат" ду маротиба калонтар аст (65536 ба ҷои 32767 ). Мо метавонем -ро истифода барем , ба шарте ки рамзи мо ба доираи 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' ба рамзи он табдил ёфт, ки 49 аст (шумо метавонед онро дар ҷадвали боло тафтиш кунед). Аз ин рӯ, натиҷа ба 50 баробар шуд. Биёед бори дигар дӯсти деринаи худро -мисол гирем ва кӯшиш кунем, ки онро бо рақам илова кунем.
public static void main(String[] args) {

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

   System.out.println(c + x);
}
Натиҷаи консол: 33016 Мо аллакай фаҳмидем, киба рамзи 32816 мувофиқат мекунад. Ва вақте ки мо ин рақам ва 200-ро илова мекунем, мо маҳз натиҷаи худро мегирем - 33016 :) Механизми кор, чунон ки шумо мебинед, хеле содда аст.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION