Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Hekuri
  • Konvertimi i llojit në java. Konvertimi automatik i tipit në shprehje

Konvertimi i llojit në java. Konvertimi automatik i tipit në shprehje

Artikulli i dhënë:

  • shkruar nga ekipi. Shpresojmë se do të jetë e dobishme për ju. Gëzuar lexim!
  • ky është një nga artikujt tonë

Konvertimi i tipit është një temë që mund të duket e frikshme për programuesit fillestarë Java. Sidoqoftë, ne ju sigurojmë, në fakt, gjithçka është e thjeshtë. Gjëja kryesore për të kuptuar sipas çfarë ligjesh ndodh ndërveprimi ndërmjet variablave dhe mbani mend këtë kur shkruani programe. Pra, le ta kuptojmë.

Në Java, ekzistojnë 2 lloje transformimesh - një fotografi për t'ju ndihmuar:

Kujtojmë se i gjithë "Java Universe" përbëhet nga:

  • lloje primitive(byte, shkurt, int, i gjatë, char, float, double, boolean)
  • objektet

Në këtë artikull ne:

  • merrni parasysh konvertimin e tipit për llojet primitive të variablave
  • transformimi i objekteve (String, Scanner, etj.) nuk merret parasysh në këtë artikull, pasi një "magji" e veçantë ndodh me objektet - kjo është një temë për një artikull të veçantë.
Konvertimi automatik

Epo, mirë, le të përpiqemi të kuptojmë se çfarë është "konvertimi automatik".

Mos harroni kur shikuam llojet e variablave (në artikull) e thamë atë një variabël është një lloj "enë" Një që mund të ruajë një vlerë për përdorim të mëvonshëm në program. Ne folëm gjithashtu për faktin se çdo lloj variabli ka diapazonin e vet. vlerat e lejuara dhe sasinë e memories së përdorur. Këtu është shenja ku shkruhej:

Pra, kjo është ajo që ne po arrijmë në të vërtetë. Për më tepër, nuk ishte aspak e lehtë për ju që t'ju jepeshin vargjet e vlerave të vlefshme dhe sasia e memories së zënë 🙂

Le të krahasojmë, për shembull:

1. bajt dhe i shkurtër. byte ka një gamë më të vogël vlerash të vlefshme se sa të shkurtër. Kjo do të thotë, byte është si një kuti më e vogël, dhe shorti është një kuti më e madhe. Dhe kjo do të thotë shkurtimisht mund të vendosim bajt.

2. bajt dhe ndër. byte ka një gamë më të vogël vlerash të vlefshme se int. Kjo do të thotë, byte është si një kuti më e vogël, dhe int është një kuti më e madhe. Dhe kjo do të thotë ne mund të vendosim bajt në int.

3.int dhe të gjatë. int ka një gamë më të vogël vlerash të vlefshme se sa të gjata. Kjo do të thotë, int është si një kuti më e vogël, dhe e gjata është një kuti më e madhe. Dhe kjo do të thotë ne mund të fole int gjatë.

Ky është një shembull i konvertimit automatik. Kjo mund të përshkruhet në mënyrë skematike në formën e figurës së mëposhtme:

Le të shohim se si funksionon kjo në praktikë.

Shembulli #1

Kodi #1 - nëse e përdorni këtë kod në kompjuterin tuaj,

Testi i klasës ( kryesore e zbrazët statike publike (args me varg) ( bajt a = 15; bajt b = a; System.out.println (b); ) )

Testi i klasës (

byte a = 15 ;

bajt b = a ;

Kodi #2 - nëse e përdorni këtë kod në kompjuterin tuaj, tastiera do të shfaqë numrin 15

Testi i klasës ( kryesore e zbrazët statike publike (args me vargje) ( bajt a = 15; int b = a; System.out.println (b); ) )

Testi i klasës (

kryesore e zbrazët statike publike (args me vargje)(

byte a = 15 ;

int b = a ;

Sistemi. jashtë . println(b);

Dhe-dhe-dhe? Ju mendoni se sa herë u printua i njëjti numër në tastierë, dhe kodi #1 ndryshon nga kodi #2 vetëm në llojin e ndryshores b atëherë nuk ka dallim mes tyre? E nuk është kështu.

Kodi #2 përmban automatikekonvertimi i tipit , por në kodin nr. 1 - nr:

Edhe pse numri është në thelb i njëjtë, por tani është në b rreth një enë më e madhe që zë më shumë hapësirë ​​në disk. Në këtë rast, JVM kryen transformime automatike për ju. Ajo e di atë ndër me shume se bajt .

Cast

Një tjetër gjë është nëse po përpiqeni të transferoni diçka nga një enë më e madhe në një më të vogël.

Ju mund ta dini se një enë më e madhe përmban diçka që përshtatet në një të vogël - por JVM nuk e di këtë dhe përpiqet t'ju mbrojë nga gabimet.

Prandaj, duhet të "thoni drejtpërdrejt" se situata është nën kontroll:

Testi i klasës ( kryesore e zbrazët statike publike (args me vargje) ( int a=0; e gjatë b=15; a = (int) b; ) )

Testi i klasës (

kryesore e zbrazët statike publike (args me vargje)(

int a = 0;

e gjatë b = 15;

a = (int ) b ;

Këtu kemi shtuar (int) përpara b. Nëse ndryshorja a ishte, për shembull, bajt, në kllapa do të ishte (byte) . Formula e përgjithshme duket kështu:

Ajo thotë "bëni vlerë (më të madhe). b një variabël i llojit (objektiv) që më nevojitet ndër ".

Nëse diçka shkoi keq.

Deri më tani, ne kemi parë situata duke supozuar se e dimë saktësisht se çfarë po bëjmë. Por, çka nëse përpiqeni të vendosni në një enë diçka që nuk përshtatet atje?

Rezulton se vetëm ajo që "përshtatet" do të mbetet në enë. Për shembull, numrat me pikë lundruese do të "ndërpriten" fraksion:

//shembulli 1 Test i klasës ( main static void publik (String args) ( double a=11.2345; int b=(int)a; System.out.println(b); // tastiera do të shfaqë numrin 11 ) )

//shembulli 1

Testi i klasës (

kryesore e zbrazët statike publike (args me vargje)(

dyfishi a = 11,2345;

int b = (int ) a ;

Sistemi. jashtë . println(b); // tastiera do të shfaqë numrin 11

Duhet mbajtur mend se pjesa e pjesshme jo të rrumbullakosura, a i hedhur poshtë.

Por çfarë ndodh nëse përpiqemi të vendosim një numër që është jashtë kufijve? Për shembull, nëse në bajt (vargu i bajtit nga -128 në 127) vendosni numrin 128? Mendoni se do të marrim 1? Nr. Ne marrim -128:

Testi i klasës (produkti publik statik i zbrazët (args i vargut) (dyfishtë a=128; bajt b=(bajt)a; System.out.println(b); //do të shohim -128 në tastierë) )

Vlera e një variabli mund të llogaritet nga një konvertim i tillë, por qëllimi i programuesit është të parandalojë një situatë ku vlera është jashtë kufijve, pasi kjo mund të çojë në punë e gabuar programet.

Detyrat:
  1. Shkruani në mënyrë sekuenciale në përpilues konvertimet e të gjitha llojeve primitive me njëri-tjetrin, duke përfshirë llojet e shkronjave dhe Bëni një tabelë si kjo:
bajt shkurt karakter ndër gjatë noton dyfishtë logjike
bajt
shkurt
karakter
ndër
E gjatë
noton
dyfishtë
logjike

Në kryqëzim, shkruani: a - nëse konvertimi ndodh automatikisht, në - nëse keni nevojë të përdorni një konvertim të qartë, x - nëse konvertimi nuk është i mundur.

* hedhja e një tipi në vetvete quhet identike- nuk është e nevojshme të shkruhet

  1. Shikoni përsëri se çfarë madhësie është çdo lloj primitiv. Përpiquni të bëni një diagram bllok që tregon se ku shkojnë llojet. Rrëshqitni shigjetat e etiketuara "transformimi i zgjeruar" dhe "transformimi ngushtues".
Pyetje

Kur intervistoni për një pozicion Zhvilluesi Junior Java, mund t'ju kërkohet:

Çfarë dini për konvertimin e llojeve primitive të të dhënave, a ka ndonjë humbje të të dhënave, a është e mundur të konvertohet një lloj boolean?

Mundohuni t'i përgjigjeni pyetjes.

Për të përmbledhur:
  • Nëse "vendosni" përmbajtjen e një ene më të vogël në një enë më të madhe, konvertimi është automatik dhe nuk duhet të ketë gabime.
  • Nëse është e nevojshme të vendosni "një vlerë nga një enë më e madhe në një më të vogël", duhet të jeni të kujdesshëm dhe të përdorni derdhje të tipit eksplicit.
  • Kur hedhni tipe float ose dyshe në integrale, pjesa e pjesshme nuk rrumbullakoset, por thjesht hidhet.
  • Lloji boolean nuk është hedhur në asnjë nga llojet.
  • Lloji char është hedhur në lloje numerike, si një kod karakteri në sistemin UNICODE.
  • Nëse numri është më i madh se kontejneri i tij, rezultati do të jetë i paparashikueshëm.

Ky artikull përshkruan vetëm një pjesë të materialit mbi temën e derdhjes së tipit. Ekzistojnë gjithashtu cast të llojit të objektit, hedhje string (në fund të fundit, çdo gjë mund të shkruhet në një varg, apo jo?), dhe promovim automatik i tipit në shprehje.

Shpresojmë që artikulli ynë të ishte i dobishëm për ju. Është gjithashtu e mundur të regjistroheni në kurset tona Java në Kiev. Ne stërvitemi nga e para. Informacion i detajuar Mund të na gjeni në.


Ne e përfunduam artikullin tonë të fundit me faktin se ju premtova t'ju tregoja se cilat lloje mund të hidhen dhe si bëhet e gjitha. Le të fillojmë.

Cast në shprehjet aritmetike kryhet automatikisht.

byte->short->int->long->float->double

Nëse operandët a dhe b kombinohen me një operator binar (ne do ta diskutojmë këtë më poshtë), të dy operandët konvertohen në të dhëna të të njëjtit lloj përpara se të ekzekutohet, si më poshtë:

  • Nëse njëri prej operatorëve është i tipit double, i dyti gjithashtu konvertohet në double;
  • Nëse njëri prej operatorëve është i tipit float, tjetri gjithashtu konvertohet në float;
  • Nëse njëri prej operatorëve është i tipit long, i dyti gjithashtu konvertohet në long;
  • Nëse njëri prej operatorëve është i tipit int, tjetri gjithashtu konvertohet në int;

Konvertimet e tipit të lejuar

Vijat e forta tregojnë transformimin e kryer pa humbje informacioni. Ky konvertim bëhet në mënyrë implicite. Transformimet ku mund të ndodhë humbja e informacionit quhen casting. Ato tregohen me vija të ndërprera. Nëse nuk ka rreshta për llojin e të dhënave në figurë, atëherë një konvertim i tillë është i pamundur. Transformimet me humbje informacioni duhet të kryhen me shumë kujdes. Pra, si mund të humbni një pjesë të konsiderueshme të të dhënave dhe ende programi mund të funksionojë siç duhet.

Për të ngushtuar kastat, është e nevojshme të bëhet e qartë. Për shembull: byte b = (byte)128; cast int në lloj bajt.

Unë propozoj të bëj disa shembuj.

Ju mund të mos kuptoni kodi i dhënë, meqenëse nuk kam shpjeguar ende se çfarë është kompajleri, konstantet etj. Më tej në stërvitje do t'ju tregoj gjithçka, megjithëse duhet ta kisha bërë më herët. Dhe tani dua të përshkruaj se cilat rregulla duhet të kenë emrat e variablave.

  • Emrat e variablave nuk mund të fillojnë me një shifër, ato nuk mund të përdoren në emra si simbole aritmetike dhe operatorët logjikë, si dhe karakteri '#'.
  • Përdorimi i karaktereve '$' ose '_' është i pranueshëm, duke përfshirë pozicionin dhe emrin e parë.
  • Një variabël i tipit primitiv i deklaruar si anëtar i klasës (ndryshore globale) vendoset në zero si parazgjedhje.
  • Nëse një variabël deklarohet si variabël lokal në një metodë, ai duhet të inicializohet përpara përdorimit. Sepse variablat lokale nuk inicializohen si parazgjedhje. Kjo do të thotë që ju nuk mund të deklaroni një ndryshore lokale dhe ta lini atë të pa inicializuar. Kjo është, si kjo: int i;. Nëse e bëni këtë në një metodë, përpiluesi do t'ju kërkojë të vendosni një vlerë të paracaktuar, ndërsa duke krijuar një variabël të tillë si një anëtar i klasës (global), vetë përpiluesi do ta vendosë atë në 0.
  • Shtrirja dhe jetëgjatësia e një ndryshoreje kufizohet nga blloku () në të cilin është deklaruar. Nëse keni krijuar një variabël brenda metodës (siç kemi bërë në shembuj), atëherë nuk mund ta përdorni atë jashtë metodës, pasi metoda është e kufizuar me kllapa (). Ndryshorja globale është e dukshme në të gjitha blloqet.
  • Ndalohet gjithashtu përdorimi i rezervuar fjalë java. E gjithë lista fjalë kyçe mund të shihet në foton më poshtë.

Dhe meqenëse në këtë artikull preka shprehjen e një operatori binar, unë propozoj të konsideroni operatorët në Java. Për më tepër, nuk ka aq shumë teori.

Java ka disa lloje operatorësh: caktim i thjeshtë, aritmetik, unar, i barabartë dhe relacional, i kushtëzuar, krahasimi i tipit, zhvendosja bitwise dhe bitwise.

Shumë fjalë buze, por kjo foto do të shpjegojë gjithçka shumë thjesht:

Në fillim, ne do të përdorim operatorët e krahasimit, caktimit dhe postfiks në bit. Operatorët e tjerë nuk janë aq të zakonshëm, kështu që ne do të konsiderojmë vetëm ata që do të përdorim.

    Operatorët e klasës publike në Java (

    int a = 5;

    int b = 6;

    shuma int = a + b;

    dallimi int = a - b;

1. Çfarë është eksplicite dhe derdhje automatike llojet në shprehje?

Lloji i hedhjes mund të jetë i qartë ose automatik.

Me hedhjen e tipit eksplicit, vetë operacioni i derdhjes është specifikuar në mënyrë eksplicite.

Hedhja e tipit automatik kërkon të plotësohen dy kushte:

  • të dy llojet duhet të jenë të pajtueshme;
  • gjatësia lloji fillestar(lloji i burimit) duhet të jetë më i vogël se gjatësia lloji i synuar(lloj marrësi).

2. Si duket hedhja e tipit eksplicit në shprehje? Shembuj

Derdhja e tipit eksplicit lejon caktimin e llojeve të papajtueshme. Forma e përgjithshme Konvertimi i tipit eksplicit ka formën:

vlera (lloji_objektiv).

target_llojiështë lloji në të cilin dëshironi të hedhni të specifikuarin kuptimi.

Shembuj konvertimi i tipit eksplicit.

// derdhje e tipit eksplicit në shprehje bajt b; int a; dyfishtë d; noton f; d = -39,9203; a = (int)d; // a = -39 f = (float)d; // f = -39,9203 b = (bajt)d; // b = -39 d = 302930932; b = (bajt)d; // b = -12 - shkurtimi i vlerës a = -27; b = (bajt)a; // b = -27

3. Shembuj të derdhjes së tipit automatik

Shembulli 1. Derdhje automatike e llojeve integrale.

// derdhje automatike e llojeve integrale int a; bajt b; shkurt sh; b = -23; a = b; // a = -23 - derdhje e tipit automatik sh = -150; a = sh; // a = -150 i gjatë l = 200; // Gabim: "Mospërputhja e tipit: nuk mund të konvertohet nga e gjatë në int" // a = l; l = b; // l = -23 l = sh; // l = -150 char c = "Z" ; a = c; // a = 90 - kodi i karakterit "Z" boolean b1 = false; //a = b1; - gabim, llojet janë të papajtueshme

Shembulli 2. Derdhje automatike e llojeve me pikë lundruese.

// derdhje automatike në pikën lundruese noton f; dyfishtë d; f = 3,409033f; d = f; // d = 3,409033

Shembulli 3. Hedhje automatike lloje të përziera. Një rast i tillë është i mundur nëse variabël tip Vlera e pikës lundruese i caktohet një variabli të llojit të plotë.

// shndërrimi automatik i llojeve të përziera noton f; dyfishtë d; a = 28; d = a; // d = 28.0 f = a; // f = 28.0 // Gabim: Mospërputhja e tipit: nuk mund të konvertohet nga float në int // a = f;

4. Si realizohet promovimi i tipit automatik në shprehje?

Promovimi automatik i tipit ndodh në shprehje. Në këtë rast, vlera që shfaqet në shprehje promovohet automatikisht në lloje me diapazon të madh vlerash.

Kur promovoni automatikisht lloje në shprehje:

  • nëse një nga operandët e plotë është i tipit int, atëherë të gjitha vlerat e bajtit, të shkurtër dhe char promovohen në llojin int;
  • nëse një nga operandët e plotë është i tipit long, atëherë e gjithë shprehja promovohet në tip long;
  • nëse një nga operandët është tip notues, atëherë edhe lloji i të gjithë shprehjes do të jetë i tipit float (nëse nuk ka operandë të tipit double);
  • nëse njëri nga operandët është i tipit double, atëherë edhe lloji i të gjithë shprehjes do të jetë i dyfishtë.

5. Një shembull i promovimit nga tipi byte në int në të cilin shprehja nuk përmban operandë të ndryshueshëm shkruani int(e gjate)
// byte -> int bajt b; b = 1000 / 20; // b = 50, funksionon sepse rezultati vendoset në një bajt

Shembulli i mësipërm funksionon saktë sepse:

  • rezultati vendoset (i pajtueshëm) në llojin e bajtit;
  • nuk ka operandë të tipit int.

Në shembullin e mësipërm, vlera 1000 tejkalon gamën e vlerave të bajtit. Së pari, numri 1000 hidhet në llojin int. Por rezultati

1000 / 20 = 50

është hedhur në lloj bajt dhe mund të përshtatet saktë në një ndryshore b .

Nëse shkruani kështu:

bajt b; b = 100000 / 20; // gabim sepse rezultati nuk përshtatet në llojin e bajtit

atëherë do të ndodhë një gabim përpilimi me mesazhin e mëposhtëm:

Në këtë rast, rezultati nuk përshtatet në llojin e bajtit:

100000 / 20 = 5000

Pastaj ky numër (5000) bëhet automatikisht një tip int dhe përpiluesi do të lëshojë një mesazh gabimi.

Nëse bëni një transmetim të qartë të tipit:

bajt b; b = (byte) (100000 / 20); // b = -120

atëherë në këtë rast rezultati 5000 i tipit int shndërrohet në bajt të tipit. Siç e dini, një ndryshore int merr 32 bit, dhe një variabël e tipit bajt merr 8 bit. Vlera e një ndryshoreje të tipit int është e cunguar. Dhe ne kemi atë që kemi (b = -120).

Shembujt e mësipërm vlejnë edhe për variablat short dhe char.

6. Shembull. Promovimi nga tipi byte në llojin int, në të cilin shprehja përmban një operand variabël të tipit int
// promovimi i llojeve në shprehje // byte -> int bajt b; int d; d=20; // gabim, rezultati është i tipit int, pasi variabli d është i tipit int // b = 1000 / d;

Në shembullin e mësipërm, shprehja përdor variablin d e tipit int . Prandaj, përpiluesi do të japë një mesazh gabimi:

Mospërputhje e tipit: nuk mund të konvertohet nga int në bajt

Kjo do të thotë që rezultati është i llojit int (jo byte ) edhe nëse vlera përshtatet brenda intervalit të vlerave të bajtit. Meqenëse shprehja përdor një operand të ndryshueshëm d shkruani int.

Nëse zbatoni një konvertim të qartë të tipit, atëherë rezultati do të jetë i saktë:

// promovimi i llojeve në shprehje // byte -> int bajt b; int d; d=20; b = (byte ) (1000 / d); // b = 50 - punon si duhet

7. Shembull. Promovim nga tip int në tip të gjatë

Një shembull i promovimit të tipit nga int në të gjatë. Nëse njëri nga operandët është i tipit long, atëherë e gjithë shprehja promovohet në tip long.

int d; longl; d = 10000 * 200; // punon, d = 2000000 // Gabim! Mospërputhja e tipit: nuk mund të konvertohet nga i gjatë në int // d = 1L * 2L; - operandët 1L dhe 2L janë të tipit të gjatë l = 100; // gabim, një nga operandët është i llojit të gjatë // d = l * 2;

Siç mund ta shihni nga shembulli, nëse një nga operandët është i tipit long, atëherë e gjithë shprehja bëhet e tipit long.

Ndonjëherë ka situata kur ju keni vlerën e disave lloj i caktuar, dhe ju duhet ta caktoni atë në një variabël të një lloji tjetër. Për disa lloje, kjo mund të bëhet pa derdhje tipi, në raste të tilla flitet për konvertim automatik të tipit. Në Java, konvertimi automatik është i mundur vetëm kur paraqitja numerike e ndryshores së destinacionit është mjaft e saktë për të mbajtur vlerën origjinale. Një konvertim i tillë ndodh, për shembull, kur një konstante literale ose vlera e një ndryshoreje të tipit byte ose short futet në një ndryshore të tipit int. Quhet zgjerim (duke u zgjeruar) ose rrit (promovimin), sepse lloji i thellësisë së bitit më të vogël zgjerohet (ngritet) në një tip të pajtueshëm më të madh. Madhësia e llojit int është gjithmonë mjaft e madhe për të ruajtur numrat nga diapazoni i lejuar për llojin e bajtit, pra in situata të ngjashme nuk kërkohet asnjë operator eksplicit cast. E kundërta nuk është e vërtetë në shumicën e rasteve, kështu që një operator cast duhet të përdoret për të hedhur një vlerë int në një ndryshore bajt. Kjo procedurë nganjëherë quhet ngushtimi (ngushtimi), sepse po i tregoni në mënyrë eksplicite përkthyesit se vlera duhet të konvertohet për t'u përshtatur në një variabël të llojit që dëshironi. Për të hedhur një vlerë në një lloj specifik, paraprijeni atë me atë lloj të mbyllur në kllapa. Pjesa e kodit më poshtë tregon transmetimin e një lloji burimi (një variabël int) në një lloj destinacioni (një variabël bajt). Nëse gjatë një operacioni të tillë vlera e numrit të plotë shkonte përtej kufijve të diapazonit të lejuar për llojin e bajtit, ajo do të zvogëlohej nga pjesëtimi i modulit me diapazonin e lejuar për bajt (rezultati i pjesëtimit të modulit me një numër është pjesa e mbetur e pjesëtimit me ky numër),

int a = 100;
bajtb = (byte) a;

2.2.1. Konvertimi automatik i tipit në shprehje

Kur vlerësohet vlera e një shprehjeje, saktësia e kërkuar për të ruajtur rezultatet e ndërmjetme shpesh duhet të jetë më e madhe se ajo që kërkohet për të përfaqësuar rezultatin përfundimtar.

bajt a = 40;
bajt b = 50;
byte me = 100;
int d = a* b / c;

Rezultati i shprehjes së ndërmjetme (a * b) mund të shkojë përtej gamës së vlerave të lejuara për llojin e bajtit. Kjo është arsyeja pse Java promovon automatikisht çdo pjesë të shprehjes për të shtypur int, kështu që ka vend të mjaftueshëm për rezultatin e ndërmjetëm (a*b).

Konvertimi automatik i tipit ndonjëherë mund të shkaktojë mesazhe gabimi të papritura të përpiluesit. Për shembull, kodi i paraqitur më poshtë, megjithëse duket mjaft i saktë, rezulton në një mesazh gabimi gjatë fazës së përkthimit. Në të, ne po përpiqemi të shkruajmë vlerën 50 * 2, e cila duhet të përshtatet në mënyrë të përkryer në llojin e bajtit, në një variabël bajt. Por për shkak të konvertimit automatik të llojit të rezultatit në int, marrim një mesazh gabimi nga përkthyesi - në fund të fundit, kur konvertohet int në bajt, mund të ndodhë një humbje e saktësisë.

bajt b = 50;
b = b*2:
^ Lloji i papajtueshëm për =. Nevojitet një transmetim i qartë për të kthyer int në bajt.
(Lloji i papajtueshëm për =. Kërkohet konvertim i qartënë tëbyte)

Teksti i korrigjuar:
bajtb = 50;
b = (byte) (b*2);

gjë që bën që b të plotësohet me vlerën e saktë prej 100.

Nëse shprehja përdor variabla të llojeve byte, short dhe int, atëherë lloji i të gjithë shprehjes promovohet automatikisht në int për të shmangur tejmbushjen. Nëse lloji i të paktën një ndryshoreje në shprehje është i gjatë, atëherë lloji i të gjithë shprehjes promovohet gjithashtu në të gjatë. Mbani mend se të gjithë literalët me numra të plotë që nuk përfundojnë me një L (ose 1) janë të tipit int.

Nëse një shprehje përmban operandë të tipit float, atëherë lloji i të gjithë shprehjes promovohet automatikisht në float. Nëse të paktën një nga operandët është i tipit double, atëherë lloji i të gjithë shprehjes promovohet në dyfish. Si parazgjedhje, Java i trajton të gjitha literalet me pikë lundruese si të tipit double. Programi i mëposhtëm tregon se si lloji i secilës vlerë në një shprehje promovohet që të përputhet me operandin e dytë të çdo operatori binar.

promovimi i klasës (
kryesore e zbrazët statike publike (args me vargje)(
byteb=42;
char me= "a';
pantallona të shkurtra = 1024;
int i = 50000;
float f = 5,67f;
dyfishuar=.1234;
rezultat i dyfishtë = (f*b) + (i/ c) - (d* s);
Sistemi, jashtë. println ((f* b)+ "+ "+ (i / c)+ "-" + (d* s));
Sistemi, jashtë. println("rezultat = "+rezultat); )
}

Nënshprehja f*b është një float e shumëzuar me një bajt, kështu që promovohet automatikisht në float. Lloji i nënshprehjes tjetër i/c (int i ndarë me char) promovohet në int. Në mënyrë të ngjashme, nënshprehja d*s (dyfishi i shumëzuar me shkurt) promovohet në dyfish. Në hapin tjetër të llogaritjeve, kemi të bëjmë me tre rezultate të ndërmjetme të llojeve float, int dhe double. Së pari, kur shtohen dy të parat, lloji int promovohet në float dhe rezultati është një rezultat float. Kur zbritet një vlerë e dyfishtë prej saj, lloji i rezultatit promovohet në dyfish. Rezultati përfundimtar i të gjithë shprehjes është një vlerë e dyfishtë.

Tani që kemi parë të gjitha llojet e thjeshta, duke përfshirë numrat e plotë, realët, simbolet dhe booleans, le të përpiqemi të bashkojmë të gjithë informacionin. Shembulli i mëposhtëm krijon variabla për secilën prej tyre lloje të thjeshta dhe shfaqen vlerat e këtyre variablave.

klasa SimpleType (
boshllëk publik statik kryesor (Args varg ) (
byte b = 0x55;
s i shkurtër = 0x55ff;
int i = 1000000;
e gjatë l = 0xffffffffL;
char me= 'a';
float f= .25f;
dyfishi d = .00001234;
boolean bool = e vërtetë;
System.out.println ("byte b = " + b);
System.out.println("short s = " +s);
System.out.println ("int i =" + i);
System.out.println("long 1 = " + l);
System.out.println("char with=” + me);
System.out.println ("float f = " + f);
System.out.println ("double d = " + d);
System.out.println ("boolean bool =" + bool); )
}

Kur ekzekutoni këtë program, duhet të merrni daljen e treguar më poshtë:

bajt b = 85
pantallona të shkurtra = 22015
int i = 1000000
e gjatë 1 = 4294967295
char me= a
noton f = 0,25
dyfish d=1.234e-005
bool bool = e vërtetë

Vini re se numrat e plotë janë shtypur me shënim dhjetor, megjithëse disa prej tyre i kemi specifikuar në heksadecimal.

Përditësimi i fundit: 29.10.2018

Të gjithë lloji i bazës të dhënat zënë një numër të caktuar bajtësh të memories. Kjo vendos një kufizim për operacionet në të cilat Llojet e ndryshme të dhëna. Merrni parasysh shembullin e mëposhtëm:

int a = 4; bajt b = a; //! Gabim

Në këtë kod, do të hasim një gabim. Edhe pse si tipi byte ashtu edhe lloji int përfaqësojnë numra të plotë. Për më tepër, vlera e ndryshores a, e cila i është caktuar një ndryshoreje të llojit të bajtit, është mirë brenda intervalit të vlerave për llojin e bajtit (nga -128 në 127). Megjithatë, hasim një gabim në kohën e përpilimit. Sepse në këtë rast ne po përpiqemi t'i caktojmë disa të dhëna që marrin 4 bajt në një variabël që merr vetëm një bajt.

Megjithatë, programi mund të kërkojë që të kryhet një konvertim i tillë. Në këtë rast, më duhet të përdor operacionin e konvertimit të tipit (operacioni ()):

int a = 4; byteb = (byte)a; // konvertimi i tipit: nga lloji int në bajt të tipit System.out.println(b); // 4

Operacioni i konvertimit të tipit përfshin specifikimin në kllapa të llojit në të cilin vlera do të konvertohet. Për shembull, në rastin e operacionit (byte)a, lloji i të dhënave int konvertohet në llojin e bajtit. Si rezultat, ne do të marrim një vlerë të llojit të bajtit.

Konvertime eksplicite dhe implicite

Kur të dhënat përfshihen në një operacion tipe te ndryshme, nuk është gjithmonë e nevojshme të përdoret një operacion i konvertimit të tipit. Disa lloje transformimesh kryhen në mënyrë implicite, automatikisht.

Konvertime automatike

Shigjetat në figurë tregojnë se cili lloj konvertimi mund të kryhet automatikisht. Shigjetat e prera tregojnë konvertimet automatike me humbje të saktësisë.

Prodhohet automatikisht pa asnje problem transformime në zgjerim(zgjerimi) - zgjerojnë paraqitjen e një objekti në kujtesë. Për shembull:

Bajt b = 7; int d = b; // konverto nga bajt në int

Në këtë rast, një vlerë e tipit byte, e cila zë 1 bajt në memorie, zgjerohet në llojin int, e cila zë 4 bajt.

Transformimet automatike të zgjeruara përfaqësohen nga zinxhirët e mëposhtëm:

byte -> short -> int -> long

int -> dyfish

shkurt -> float -> dyfish

char -> int

Humbja automatike e konvertimeve precize

Disa konvertime mund të kryhen automatikisht midis llojeve të të dhënave me të njëjtën thellësi biti, ose edhe nga një lloj i të dhënave me gjerësi biti më të madh në një lloj të dhënash me gjerësi biti më të vogël. Këto janë zinxhirët e mëposhtëm të konvertimeve: int -> float , long -> float dhe long -> double janë randomizuar pa gabime, por mund të hasim humbje informacioni gjatë konvertimit.

Për shembull:

Int a = 2147483647; noton b = a; // nga int në float System.out.println(b); // 2.14748365E9

Konvertime të qarta

Në të gjitha konvertimet e tjera të tipit primitiv, operacioni i konvertimit të tipit zbatohet në mënyrë eksplicite. Zakonisht këto janë konvertime ngushtuese (ngushtim) nga një lloj me thellësi më të madhe të bitit në një lloj me gjerësi biti më të ulët:

E gjatë a = 4; int b = (int) a;

Humbja e të dhënave gjatë konvertimit

Kur aplikojmë konvertime të qarta, mund të hasim humbje të të dhënave. Për shembull, kodi i mëposhtëm nuk do të shkaktojë ndonjë problem për ne:

Int a = 5; byte b = (byte) a; System.out.println(b); // 5

Numri 5 përshtatet mirë në gamën e vlerave të llojit të bajtit, kështu që pas konvertimit, ndryshorja b do të jetë e barabartë me 5. Por çfarë do të ndodhë në rastin e mëposhtëm:

Int a = 258; byte b = (byte) a; System.out.println(b); // 2

Rezultati do të jetë numri 2. Në këtë rast, numri 258 është jashtë rrezes për llojin e bajtit (nga -128 në 127), kështu që vlera do të shkurtohet. Pse rezultati është saktësisht numri 2?

Numri a, i cili është 258, in sistemi binar do të jetë e barabartë me 00000000 00000000 00000001 00000010 . Vlerat e tipit bajt zënë vetëm 8 bit në memorie. Kështu që paraqitje binare int është shkurtuar në 8 shifra djathtas, d.m.th. 00000010, e cila në sistemi dhjetor jep numrin 2.

Shkurtimi i numrave racional në numra të plotë

Kur konvertoni vlerat e pikës lundruese në vlera të plota, pjesa e pjesshme shkurtohet:

Dyfishi a = 56,9898; intb = (int)a;

Këtu vlera e b do të ishte 56, edhe pse 57 do të ishte më afër 56,9898. Për të shmangur incidente të tilla, është e nevojshme të përdorni funksionin e rrumbullakosjes, i cili është in biblioteka e matematikës Java:

Dyfishi a = 56,9898; int b = (int)Math.round(a);

Transformimet e transaksioneve

Nuk janë të rralla rastet kur duhet të aplikoni operacione të ndryshme, si shtimi dhe prodhimi, në vlera të llojeve të ndryshme. Disa rregulla zbatohen gjithashtu këtu:

    nëse një nga operandët e operacionit është i tipit double, atëherë edhe operandi i dytë konvertohet në tip double.

    nëse kushti i mëparshëm nuk plotësohet dhe një nga operandët e operacionit është i tipit float, atëherë operandi i dytë konvertohet në tip float

    nëse kushtet e mëparshme nuk plotësohen, një nga operandët e operacionit është i tipit long, atëherë operandi i dytë shndërrohet në tip long.

    përndryshe, të gjithë operandët e operacionit konvertohen në tipin int

Shembuj të transformimit:

Int a = 3; dyfishtë b = 4,6; dyfishi c = a+b;

Meqenëse vlera e tipit të dyfishtë është e përfshirë në operacion, vlera tjetër hidhet gjithashtu në tipin e dyfishtë dhe shuma e dy vlerave a + b do të përfaqësojë llojin e dyfishtë.

Një shembull tjetër:

Bajt a = 3; shkurt b = 4; bajt c = (bajt)(a+b);

Dy variabla të tipit byte dhe short (jo double, float ose long), kështu që ato konvertohen në llojin int kur shtohen, dhe shuma e tyre a+b përfaqëson një vlerë int. Prandaj, nëse më pas ia caktojmë këtë shumë një variabli të tipit byte, atëherë përsëri duhet të bëjmë një konvertim të tipit në bajt.

Nëse të dhënat e tipit char përfshihen në operacione, atëherë ato konvertohen në int:

Int d = "a" + 5; System.out.println(d); // 102

Artikujt kryesorë të lidhur