Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Transmetimi i double në int java. Lloji i konvertimit në Java

Ndonjëherë situatat lindin kur keni një vlerë të një lloji të caktuar dhe ju duhet ta caktoni atë në një ndryshore 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ë ishte jashtë intervalit të lejuar për llojin e bajtit, ajo do të zvogëlohej me ndarjen e 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 këtë 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ë konvertim automatik Nëse lloji i rezultatit është int, marrim një mesazh gabimi nga përkthyesi - në fund të fundit, kur konvertohet një int në një 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 shprehja përmban operandë tip notues, 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.

Java është një gjuhë programimi e shtypur fort, që do të thotë se çdo shprehje dhe çdo variabël ka një të shtypur fort lloj i caktuar tashmë në momentin e përpilimit.
Llojet e kallëpeve
Java ofron shtatë lloje kastesh:

  • Identiteti;

  • Zgjerimi i një tipi primitiv (primitiv zgjerues);

  • tip primitiv ngushtues (ngushtues primitiv);

  • Zgjerimi i llojit të objektit (referenca e zgjerimit);

  • Ngushtimi i llojit të objektit (referenca e ngushtimit);

  • Konverto në varg (String);

  • Shndërrime të ndaluara (të ndaluara);
Le t'i shqyrtojmë ato veçmas.
Transformimi i identitetit
Më e thjeshta është transformimi i identitetit. Në Java, konvertimi i një shprehjeje të çdo lloji në të njëjtin lloj është gjithmonë i ligjshëm dhe ka sukses.
Kjo është e rëndësishme në mënyrë që të mund të argumentohet teorikisht se çdo lloj në Java mund të marrë pjesë në një konvertim, edhe nëse është identik.
Konvertimi primitiv i tipit (zgjerimi dhe ngushtimi)
Për llojet e thjeshta, zgjerimi do të thotë se bëhet një kalim nga një lloj më pak i gjerë në një më të gjerë. Për shembull, nga lloji byte (gjatësia 1 bajt) në lloji int (gjatësia 4 byte). Transformime të tilla janë të sigurta në kuptimin që lloj i riështë gjithmonë e garantuar të përmbajë të gjitha të dhënat që janë ruajtur në llojin e vjetër, dhe kështu nuk ndodh humbje e të dhënave. Kjo është arsyeja pse përpiluesi e zbaton atë vetë, në mënyrë të padukshme për zhvilluesin:

byteb=3;
int a=b;

19 transformimet e mëposhtme po zgjerohen:

  • Nga bajt në shkurt, int, i gjatë, float, dyfish

  • Nga i shkurtër në int, i gjatë, float, dyfish

  • Nga char në int, e gjatë, float, dyfish

  • Nga int në të gjatë, float, dyfish

  • Nga e gjata te noton, dyfish

  • float për të dyfishuar
Vini re se nuk mund të konvertoheni në char nga llojet më të vogla se ose gjatësi të barabartë(byte, short) ose anasjelltas në shkurt nga char pa humbje të të dhënave. Kjo për faktin se char, ndryshe nga llojet e tjera të numrave të plotë, është i nënshkruar.
Sidoqoftë, duhet mbajtur mend se edhe me zgjerim, të dhënat ende mund të shtrembërohen. Këto janë hedhje nga vlerat int në float dhe hedhjet nga vlerat e gjata në float ose dyfish. Edhe pse këto lloje të pjesshme mund të strehojnë shumë numra të mëdhenj se numrat e plotë përkatës, por ato kanë më pak shifra të rëndësishme.
Për shembull:

e gjatë a = 111111111111L;
float f=a;
a=(e gjate)f; // () është vetëm një operacion i konvertimit të tipit
System.out.println(a); //rezultati 111111110656

Kushtojini vëmendje - ngushtimi - do të thotë që kalimi kryhet nga një lloj më i gjerë në një më pak të gjerë. Me një konvertim të tillë, ekziston rreziku i humbjes së të dhënave. Për shembull, nëse një int ishte më e madhe se 127, atëherë kur të hidhet në bajt, vlerat e bitit më të vjetra se e teta do të humbasin. Në Java, një konvertim i tillë duhet të bëhet në mënyrë eksplicite, d.m.th. programuesi në kod duhet të tregojë në mënyrë eksplicite se ai synon të kryejë një konvertim të tillë dhe është gati të humbasë të dhënat.
23 transformimet e mëposhtme po ngushtohen:

  • nga bajt në karakter

  • Nga shkurt në bajt, char

  • Nga karakteri në bajt, shkurt

  • Nga int në byte, i shkurtër, char

  • Nga e gjata në bajt, e shkurtër, char, int

  • Nga float në bajt, i shkurtër, char, int, i gjatë

  • Nga dyfishi në bajt, i shkurtër, char, int, i gjatë, float
Kur ngushtoni një tip numër të plotë në një tip numër të plotë më të ngushtë, të gjithë bitat e rendit të lartë që nuk përshtaten në llojin e ri thjesht hidhen. Asnjë rrumbullakim ose veprime të tjera nuk kryhen për të marrë një rezultat më të saktë:

System.out.println((byte)383);
System.out.println((byte)384);
System.out.println((byte)-384);

Rezultati do të jetë:

127
-128
-128
Mund të shihet se biti i shenjës nuk pati ndonjë efekt gjatë ngushtimit, pasi thjesht u hodh - rezultati i hedhjes së numrave reciprokë (384, -384) doli të ishte i njëjtë. Rrjedhimisht, mund të humbasë jo vetëm vlera e saktë absolute, por edhe shenja e sasisë.
Kjo është e vërtetë edhe për karakterin:

char c=4000;
System.out.println((shkurt)c);

Rezultati:

-25536
Konvertimi i llojit të referencës (zgjerimi dhe ngushtimi)
Konvertimi i llojit të objektit ilustrohet më së miri duke përdorur një pemë trashëgimore. Konsideroni një shembull të vogël të trashëgimisë:

prindi i klasës(
intx;
}

klasa ChildY zgjat prind(
int y;
}

klasa ChildZ zgjeron prindin(
intz;
}

Çdo klasë deklaron një fushë me një emër unik. Ne do ta konsiderojmë këtë fushë si një shembull të një grupi të vetive unike të natyrshme në një lloj objekti.
Objektet e klasës Parent kanë vetëm një fushë x, që do të thotë se vetëm referencat e tipit Parent mund t'u referohen objekteve të tilla. Objektet e klasës ChildY kanë një fushë y dhe një fushë x të trashëguar nga klasa Parent. Prandaj, referencat e tipit ChildY ose Parent mund të tregojnë objekte të tilla. Shembull:

Prindi p = newChildY();

Vini re se kjo referencë p mund të hyjë vetëm në fushën x të objektit të krijuar. Fusha y nuk është e disponueshme sepse përpiluesi, kur kontrollon korrektësinë e shprehjes p.y, nuk mund të parashikojë që referenca p do të tregojë një objekt të tipit ChildY në kohën e ekzekutimit. Ajo analizon vetëm llojin e vetë variablit dhe deklarohet si Parent, por kjo klasë nuk ka një fushë y, e cila do të shkaktojë një gabim përpilimi.
Në mënyrë të ngjashme, objektet e klasës ChildZ kanë një fushë z dhe një fushë x të trashëguar nga klasa Parent. Kjo do të thotë se referenca si ChildZ dhe Parent mund të tregojnë objekte të tilla.
Kështu, referencat e tipit Parent mund të tregojnë një objekt të cilitdo prej tre llojeve të konsideruara, ndërsa referencat e tipit ChildY dhe ChildZ mund të tregojnë vetëm objekte të të njëjtit lloj. Tani mund të kalojmë në konvertimin e llojeve të referencës bazuar në një pemë të tillë trashëgimie.
Zgjerim nënkupton kalimin nga një lloj më specifik në një lloj më pak specifik, d.m.th. kalimi nga fëmijët te prindërit. Ashtu si rasti me lloje primitive, ky tranzicion bëhet nga vetë JVM nëse është e nevojshme dhe është "i padukshëm" për zhvilluesin, domethënë nuk kërkon ndonjë transformim të veçantë.

Prindi p1=newChildY();
Prindi p2=newChildZ();

Në të dy rreshtat, variablave të tipit Parent u caktohet një vlerë e një lloji tjetër, që do të thotë se ndodh një konvertim. Për shkak se është një zgjatim, bëhet automatikisht dhe gjithmonë ka sukses.
Duhet të theksohet se me një transformim të tillë, asgjë nuk i ndodh vetë objektit. Pavarësisht se, për shembull, fusha y e klasës ChildY nuk është më e disponueshme, kjo nuk do të thotë se ajo është zhdukur. Një ndryshim kaq i rëndësishëm në objekt nuk është i mundur. Ai rrjedh nga klasa ChildY dhe ruan të gjitha vetitë e tij. Vetëm lloji i lidhjes përmes së cilës aksesohet objekti ka ndryshuar.
Tranzicioni i kundërt, domethënë lëvizja poshtë pemës së trashëgimisë te trashëgimtarët, është një ngushtim. Për shembull, në këtë rast, kalimi nga një referencë e tipit Parent , e cila mund t'i referohet objekteve të tre klasave, në një referencë të tipit ChildY, e cila mund t'i referohet vetëm njërës nga tre klasat, është padyshim një ngushtim. Një tranzicion i tillë mund të mos jetë i mundur. Nëse një referencë e tipit Parent i referohet një objekti të tipit Parent ose ChildZ, atëherë kalimi në ChildY është i pamundur, pasi në të dyja rastet objekti nuk ka fushën y, e cila deklarohet në klasën ChildY. Prandaj, kur ngushtohet, zhvilluesi duhet të tregojë në mënyrë eksplicite se është e nevojshme të përpiqet të kryejë një transformim të tillë. JVM do të kontrollojë korrektësinë e tranzicionit në kohën e ekzekutimit. Nëse është e mundur, konvertimi do të kryhet. Nëse jo, do të ndodhë një gabim (zakonisht një ClassCastException).

Prindi p=fëmija i ri();
ChildYcy = (ChildY)p; //djathtas
Prindi p2=newChildZ();
ChildYcy2 = (ChildY)p2; //gabim

Për të kontrolluar nëse tranzicioni i dëshiruar është i mundur, mund të përdorni shembullin e operatorit:

Prindi p=fëmija i ri();
nëse (p shembulli i Fëmijës)(
ChildYcy = (ChildY)p;
}

Prindi p2=newChildZ();
nëse (p2 shembulli ChildY) (
ChildYcy = (ChildY)p2;
}

Prindi p3=prindi i ri();
nëse (p3 shembulli i Fëmijës)(
ChildYcy = (ChildY)p3;
}

ky shembull nuk do të ketë gabime. Transformimi i parë është i mundur dhe do të kryhet. Në rastin e dytë dhe të tretë, kushtet e deklaratave if nuk do të funksionojnë dhe, për rrjedhojë, nuk do të ketë tranzicion të pasaktë.
Konverto në varg
Çdo lloj mund të hidhet në një varg, d.m.th. për shembull klasë String. Një konvertim i tillë është i jashtëzakonshëm për faktin se mbulon absolutisht të gjitha llojet.
Llojet e ndryshme konvertohen në një varg si më poshtë:

  • Llojet numerike shkruhen në formë teksti pa humbje të saktësisë së përfaqësimit. Së pari, bazuar në vlerën primitive, krijohet një shembull i klasës përkatëse "wrapper", më pas thirret metoda toString(). Por meqenëse këto veprime janë të padukshme nga jashtë, JVM i optimizon ato dhe i konverton vlerat primitive për të shkruar drejtpërdrejt.

  • Vlerat Boolean janë hedhur në vargun "true" ose "false" në varësi të vlerës.

  • Për vlerat e objektit, thirret metoda toString(). Nëse metoda kthen null, atëherë rezultati do të jetë vargu "null".

  • Për një vlerë null, gjenerohet vargu "null".
Konvertime të Ndaluara
Jo të gjitha kalimet ndërmjet llojeve arbitrare lejohen. Për shembull, konvertimet e ndaluara përfshijnë: kalimet nga çdo lloj referimi në primitiv dhe anasjelltas (përveç konvertimit në një varg), boolean mund të hidhet vetëm në këtë lloj ose në një varg. Për më tepër, është e pamundur të sillni me njëra-tjetrën klasa të vendosura në degët fqinje të pemës së trashëgimisë. Në shembullin, i cili u konsiderua se ilustron llojet e referencës, kalimi nga ChildY në ChildZ është i ndaluar.
Kjo listë e transformimeve të ndaluara nuk është ezauruar. Është mjaft i gjerë dhe në të njëjtën kohë të gjitha opsionet janë mjaft të dukshme, kështu që ato nuk do të konsiderohen në detaje. Ata që dëshirojnë mund të marrin informacion të plotë nga specifikimi.
Sigurisht, një përpjekje për të kryer një konvertim të ndaluar do të shkaktojë një gabim.

Duke përdorur gips
Situatat e konvertimit të tipit mund të grupohen si më poshtë:

  • Caktimi i vlerave për variablat (caktimi). Jo të gjitha tranzicionet lejohen nën një transformim të tillë - kufizimet janë zgjedhur në atë mënyrë që të mos mund të ndodhë një përjashtim.

  • Thirrja e metodës. Ky konvertim zbatohet për argumentet e metodës ose konstruktorit të thirrur. Një cast i tillë nuk gjeneron kurrë gabime. Hedhja kryhet gjithashtu kur kthehet vlera e metodës.

  • Kast eksplicit. Në këtë rast, specifikohet në mënyrë eksplicite se për cilin lloj dëshironi të hidhni vlerën origjinale.

  • Operatori i lidhjes konvertohet në një varg argumentesh të tij.

  • Zgjerimi numerik. Operacionet numerike mund të kërkojë një ndryshim në llojin e argumenteve. Ky transformim ka një emër të veçantë - i zgjeruar, që nga zgjedhja lloji i synuar mund të varet jo vetëm nga vlera fillestare, por edhe nga argumenti i dytë i operacionit.
Detyra numër 8
Shtoni në projekt përdorimin e një cast për hierarkinë tuaj të klasës.

Ndonjëherë lindin situata kur është e nevojshme t'i caktohet një vlerë një ndryshoreje të një lloji në një ndryshore të një lloji tjetër. Për shembull:

Shembulli 1: Caktimi i një vlere për një variabël të një lloji në tjetrin

int i = 11; bajt b = 22; i = b;

Ekzistojnë 2 lloje të transformimeve në Java - konvertim automatik (i nënkuptuar) Dhe derdhje e tipit (konvertim i qartë).

1. Konvertimi automatik

Merrni parasysh konvertimin e parë automatik. Nëse të dy llojet janë të pajtueshme, konvertimi i tyre do të bëhet automatikisht nga Java. Për shembull, një vlerë si bajt mund t'i caktohet gjithmonë një variabli të llojit ndër , siç tregohet në shembullin 1.

Për konvertimin automatik të tipit, duhet të plotësohen dy kushte:

  • të dy llojet duhet të jenë të pajtueshme
  • gjatësia e llojit të synuar duhet të jetë më e madhe se gjatësia lloji origjinal

Në këtë rast, ndodh konvertimi i zgjerimit.

Diagrami i mëposhtëm tregon zgjerimin e konvertimit në Java:

Linjat e ngurta tregojnë konvertimet e kryera pa humbje të të dhënave. Vijat e ndërprera tregojnë se mund të ndodhë një humbje e saktësisë gjatë konvertimit.

Për shembull, lloji i të dhënave ndër gjithmonë mjaft i madh për të mbajtur gjithçka vlerat e lejuara lloji bajt , kështu që nuk ka operatorë të qartë të transmetimit këtë rast nuk kërkohet. Për sa i përket zgjerimit të konvertimit, llojet e të dhënave numerike, duke përfshirë numrin e plotë dhe pikën lundruese, janë të pajtueshme me njëri-tjetrin. Në të njëjtën kohë, nuk ka konvertime automatike të llojeve numerike në tip karakter ose logjike . Llojet karakter Dhe logjike gjithashtu të papajtueshme me njëra-tjetrën.

Vlen të shpjegohet pak pse, për shembull, lloji bajt nuk konvertohet automatikisht (në mënyrë implicite) në një lloj karakter , edhe pse lloji bajt është 8 bit i gjerë, dhe karakter - 16, e njëjta gjë vlen edhe për konvertimin e tipit shkurt karakter . Kjo ndodh sepse bajt Dhe shkurt llojet e të dhënave të nënshkruara dhe karakter e panënshkruar. Prandaj, në këtë rast, duhet të përdorni hedhjen e tipit eksplicit, pasi përpiluesi duhet të tregojë qartë se ju e dini se çfarë dëshironi dhe si do të përpunohet biti i shenjave të llojeve bajt Dhe shkurt kur konvertohet në tip karakter .

Lloji Value Behavior karakter në shumicën e rasteve përkon me sjelljen e një vlere të tipit numër të plotë, pra vlera e tipit karakter mund të përdoret kudo ku kërkohen vlera ndër ose gjatë . Megjithatë, kujtojmë se lloji karakter është e panënshkruar, pra sillet ndryshe nga tipi shkurt , edhe pse diapazoni i të dy llojeve është 16 bit.

2. Hedhje

Pavarësisht nga komoditeti i konvertimit automatik të tipit, ai nuk është në gjendje të plotësojë të gjitha nevojat urgjente. Për shembull, çka nëse vlera e llojit ndër duhet t'i caktohet një variabli të llojit bajt ? Ky konvertim nuk do të bëhet automatikisht për shkak të gjatësisë së llojit bajt më pak se lloji ndër . Ndonjëherë ky lloj transformimi quhet ngushtimi i transformimit, meqenëse vlera është ngushtuar qartë për t'u përshtatur në llojin e të dhënave të synuar.

Për të konvertuar dy lloje të dhënash të papajtueshme, duhet të përdorni një cast. Një cast është thjesht një konvertim i qartë i tipit. Forma e përgjithshme derdhja e llojit ka formën e mëposhtme:

vlera (lloji_objektiv).

ku parametri target_lloji tregon llojin në të cilin do të konvertohet vlera e specifikuar.

Shembulli 2: Hedhja

Për shembull, në fragmentin e mëposhtëm të kodit, shkruani ndër hedhur në lloj bajt:

Int i = 11; bajt b = 22; b = (bajt)i;

Shembulli 3: Konvertimi i vlerave të pikës lundruese në numra të plotë

Le të shohim një shembull të konvertimit të vlerave të pikës lundruese në numra të plotë. Në këtë shembull pjesë thyesore Vlerat e pikës lundruese thjesht hidhen poshtë (operacioni i shkurtimit):

Dyfishtë d = 3,89; int a = (int) d; //Rezultati do të jetë 3

Shembulli 4: Konvertimi i një lloji më të madh të numrit të plotë në një tip të plotë më të vogël

Kur hedhni një lloj të numrit të plotë më të gjerë në një tip numër të plotë më pak të gjerë, bitet e larta thjesht hidhen poshtë:

int i = 323; byte b = (bajt) i; //Rezultati do të jetë 67

Shembulli 5: Konvertimi i një float më të madh në një numër të plotë më të vogël

Kur hedhim një vlerë më të madhe të pikës lundruese në një numër të plotë, bitet më domethënëse shkurtohen dhe hidhen poshtë:

Dyfishtë d = 389889877779,89; i shkurtër s = (i shkurtër) d; //Rezultati do të jetë -1

3. Promovimi automatik i llojeve në shprehje

Përveç operacioneve të caktimit, konvertimet e llojeve të caktuara mund të kryhen edhe në shprehje.

gjuha Java zbatohen rregullat e mëposhtme:

  1. Nëse një operand është i tipit dyfishtë dyfishtë.
  2. noton, tjetri gjithashtu shndërrohet në tip noton.
  3. Përndryshe, nëse një operand është i tipit gjatë, tjetri gjithashtu shndërrohet në tip gjatë.
  4. Përndryshe, të dy operandët konvertohen në tip ndër.
  5. Shprehjet e kombinuara të detyrave (+=,-=,*=,/=) nuk kanë nevojë të hidhen.

Ja një shembull:

Shembulli 6: Promovimi automatik i tipit në shprehje

Kur shumëzohet ndryshorja b1 ( bajt) me 2 ( ndër) rezultati do të jetë si ndër. Prandaj, kur përpiqeni të caktoni rezultatin në ndryshoren b2 ( bajt) do të gjenerojë një gabim përpilimi. Por kur përdorni operatorin e kombinuar të caktimit (*=), ky problem nuk lind.

Bajt b1 = 1; bajt b2 = 2 * b1; //Gabim përpilimi int i1 = 2 * b1; b2 *= 2;

Shembulli 7: Promovimi i tipit automatik në shprehje

shembulli tjetër do të ndodhë gjithashtu një gabim përpilimi - pavarësisht nga fakti se numrat si bajt, rezultati i operacionit do të jetë lloji int, por jo shkurt.

Klasa publike IntegerDemo1 ( public static void main (String args) ( bajt b1 = 50, b2 = -99; shkurt k = b1 + b2; //gabim përpilimi System.out.println("k=" + k); ) )

Shembulli 8: Promovimi i tipit automatik në shprehje

Ky shembull është i ngjashëm me atë të mëparshëm, por përdoret operacioni i kombinuar i caktimit, në të cilin hedhja ndodh automatikisht.

Klasa publike IntegerDemo2 ( public static void main (String args) ( bajt b1 = 50, b2 = -99; b1 += b2; System.out.println ("b1=" + b1); ) )

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 e llojit të burimit (lloji i burimit) duhet të jetë më e vogël se gjatësia e llojit të synuar (lloji i destinacionit).

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

Derdhja e tipit eksplicit lejon caktimin e llojeve të papajtueshme. Forma e përgjithshme e derdhjes së tipit eksplicit është:

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 = (lundrues)d; // f = -39,9203 b = (byte)d; // b = -39 d = 302930932; b = (byte)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 një ndryshoreje të tipit floating point i caktohet vlera e një variabli të tipit 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 llojet 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ëri nga operandët është i tipit float, 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ë-ndryshore të tipit int (long)
// 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 llojit 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ë për variablat e tipit e shkurtër dhe char.

6. Shembull. Promovimi nga lloji 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ë 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.

Artikujt kryesorë të lidhur