Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Fier
  • Tastați conversie în java. Conversie automată a tipurilor în expresii

Tastați conversie în java. Conversie automată a tipurilor în expresii

Acest articol:

  • scris de echipa. Sperăm că vă va fi de folos. Lectura placuta!
  • acesta este unul dintre articolele noastre

Conversia tipului este un subiect care poate părea descurajant pentru cei care sunt începători în programarea Java. Cu toate acestea, vă asigurăm că totul este de fapt simplu. Principalul lucru este să înțelegi ce legi guvernează interacțiunea dintre variabile și rețineți acest lucru atunci când scrieți programe. Deci, hai să ne dăm seama.

Există 2 tipuri de transformări în Java - imaginea vă va ajuta:

Amintiți-vă că întregul „Univers Java” este format din:

În acest articol noi:

  • luați în considerare conversia tipului pentru tipurile de variabile primitive
  • conversia obiectelor (String, Scanner etc.) nu este luată în considerare în acest articol, deoarece obiectelor se întâmplă o „magie” separată - acesta este un subiect pentru un articol separat.
Conversie automată

Ei bine, să încercăm să ne dăm seama ce este „conversia automată”.

Amintiți-vă, când ne-am uitat la tipurile de variabile (în articol), am spus asta o variabilă este un fel de „container” , care poate stoca o valoare pentru utilizare ulterioară în program. Am mai vorbit despre faptul că fiecare tip de variabilă are propriul său interval valori acceptabileși cantitatea de memorie ocupată. Iată semnul unde a fost scris totul:

Deci, la asta ajungem de fapt. În plus, nu este doar faptul că ți s-au oferit intervale de valori acceptabile și cantitatea de memorie ocupată :)

Să comparăm, de exemplu:

1. octet și scurt. byte are un interval mai mic de valori valide decât scurt. Adică, byte este ca o casetă mai mică, iar scurtă este o casetă mai mare. Si asta inseamnă putem pune octetul pe scurt.

2. octet și int. byte are un interval mai mic de valori valide decât int. Adică, byte este ca o casetă mai mică, iar int este ca o casetă mai mare. Si asta inseamnă putem pune octet în int.

3. int și lung. int are un interval mai mic de valori valide decât long. Adică, int este ca o cutie mai mică, iar long este ca o cutie mai mare. Si asta inseamnă putem pune int în lung.

Acesta este un exemplu de conversie automată. Acest lucru poate fi reprezentat schematic sub forma unei imagini ca aceasta:

Să vedem cum funcționează acest lucru în practică.

Exemplul nr. 1

Codul nr. 1 - dacă rulați acest cod pe computer,

Class Test ( public static void main(String args) ( octet a = 15; octet b = a; System.out.println(b); ) )

test de clasa(

octet a = 15;

octet b = a ;

Codul nr. 2 - dacă rulați acest cod pe computer, numărul 15 va fi afișat în consolă

Class Test ( public static void main(String args) ( octet a = 15; int b = a; System.out.println(b); ) )

test de clasa(

public static void main (Argumente șir) (

octet a = 15;

int b = a ;

Sistem. afară . println(b);

Eeyore? Crezi ca ori același număr a fost scos pe consolă, iar codul nr. 1 diferă de codul nr. 2 doar prin tipul de variabilă b , atunci nu există nicio diferență între ele? E nu este adevarat.

Codul nr.2 conţine automatconversie de tip , dar în codul nr. 1 - nu:

Deși numărul este, în principiu, același, acum este în b O un container mai mare care ocupă mai mult spațiu pe disc. În acest caz, JVM-ul efectuează conversii automate pentru dvs. Ea știe asta int mai mult decât octet .

Distribuție

Este o problemă diferită dacă încercați să transferați ceva dintr-un recipient mai mare într-unul mai mic.

Poate știți că containerul mai mare conține ceva care poate încăpea în cel mic - dar JVM-ul nu știe despre acest lucru și încearcă să vă protejeze de erori.

Prin urmare, trebuie să „spuneți clar” că situația este sub control:

Class Test ( public static void main(String args) ( int a=0; long b=15; a = (int) b; ) )

test de clasa(

public static void main (Argumente șir) (

int a = 0 ;

lung b = 15;

a = (int) b;

Aici am adăugat (int) inainte de b. Dacă variabila A a fost, de exemplu, ca octet, între paranteze ar fi (octet) . Formula generala arata asa:

Ea spune „face de (mai) sens b o variabilă de tipul de care am nevoie (țintă) int ".

Dacă ceva a mers prost.

Înainte de aceasta, am abordat situațiile presupunând că știm exact ce facem. Dar dacă încerci să pui ceva într-un recipient care nu se potrivește acolo?

Se pare că doar ceea ce „se potrivește” acolo va rămâne în recipient. De exemplu, numerele cu virgulă mobilă vor fi „decupate” fracțiune:

//exemplu 1 test de clasă ( public static void main(String args) ( double a=11.2345; int b=(int)a; System.out.println(b); // consola va afișa numărul 11 ​​) )

//exemplul 1

test de clasa(

public static void main (Argumente șir) (

dublu a = 11,2345;

int b = (int ) a ;

Sistem. afară . println(b); // consola va afișa numărul 11

Trebuie să ne amintim că partea fracționată nu rotunjite, A aruncat.

Ce se întâmplă dacă încercăm să plasăm un număr care se află în afara intervalului permis? De exemplu, dacă puneți numărul 128 în octet (interval de octeți de la -128 la 127)? Crezi că vom primi 1? Nu. Obținem -128:

Class Test ( public static void main(String args) ( double a=128; byte b=(byte)a; System.out.println(b); // vom vedea -128 în consolă) )

Valoarea unei variabile cu o astfel de transformare poate fi calculată, dar scopul programatorului este de a evita o situație în care valoarea depășește limitele permise, deoarece acest lucru poate duce la defecțiune programe.

Sarcini:
  1. Scrieți în mod constant în compilator conversiile tuturor tipurilor primitive între ele, inclusiv caracterul și tipurile. Faceți un tabel ca acesta:
octet mic de statura char int lung pluti dubla boolean
octet
mic de statura
char
int
Lung
Pluti
dubla
boolean

La intersecție scrieți: a - dacă conversia are loc automat, on - dacă trebuie să utilizați o conversie explicită, x - dacă conversia este imposibilă.

* se numește turnarea unui tip în sine identic– nu este necesară înregistrarea acestuia

  1. Priviți din nou ce dimensiune are fiecare tip primitiv. Încercați să faceți o diagramă care să arate ce tipuri merg unde. Desenați săgețile etichetate „transformare extinsă” și „transformare restrânsă”.
Întrebări

În timpul unui interviu pentru postul de Junior Java Developer, s-ar putea să fii întrebat:

Ce știți despre conversia tipurilor de date primitive, există pierderi de date, este posibil să convertiți un tip boolean?

Încercați să răspundeți la întrebare.

Să rezumăm:
  • Dacă „puneți” conținutul unui container mai mic într-un container mai mare, conversia are loc automat și nu ar trebui să apară erori.
  • Dacă este nevoie să puneți „o valoare dintr-un container mai mare într-unul mai mic”, trebuie să fiți atenți și să utilizați tipul de turnare explicit.
  • Când turnați tipurile float sau dublu la întreg, partea fracțională nu este rotunjită, ci pur și simplu aruncată.
  • Tipul boolean nu poate fi convertit la niciun tip.
  • Tipul de caractere este transformat în tipuri numerice, ca un cod de caractere în sistemul UNICODE.
  • Dacă numărul este mai mare decât containerul său, rezultatul va fi imprevizibil.

Acest articol descrie doar o parte a materialului pe tema turnării tipului. Există și modele de tip obiect, turnări pe un șir (la urma urmei, orice poate fi scris într-un șir, nu?) și promovarea automată a tipului în expresii.

Sperăm că articolul nostru v-a fost de folos. Există, de asemenea, posibilitatea de a vă înscrie la cursurile noastre Java din Kiev. Predăm de la zero. Informatii detaliateÎl puteți găsi pe site-ul nostru.


Am încheiat ultimul nostru articol despre ceea ce am promis să vă spun, ce tipuri pot fi oferite și cum se face toate acestea. Să începem.

Distribuțieîn expresii aritmetice se realizează automat.

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

Dacă operanzii a și b sunt combinați de un operator binar (vom discuta despre asta mai jos), înainte de a-l executa, ambii operanzi sunt convertiți la același tip de date, după cum urmează:

  • Dacă unul dintre operatori este de tip double, al doilea este, de asemenea, convertit în double;
  • Dacă unul dintre operatori este de tip float, al doilea este și el convertit în float;
  • Dacă unul dintre operatori este de tip long, al doilea este, de asemenea, convertit în long;
  • Dacă unul dintre operatori este de tip int, al doilea este, de asemenea, convertit în int;

Conversii de tip permise

Liniile continue arată transformarea efectuată fără pierderi de informații. Această conversie se face implicit. Transformările în care pot apărea pierderi de informații se numesc turnare. Sunt afișate cu linii întrerupte. Dacă nu există linii pentru tipul de date din figură, atunci o astfel de conversie nu este posibilă. Transformările cu pierdere de informații trebuie efectuate cu mare atenție. Deci, puteți pierde o parte semnificativă a datelor și totuși programul poate funcționa corect.

Pentru a restrânge castele, trebuie să fie explicit. De exemplu: octet b = (octet)128; cast int la tipul octet.

Vă propun să faceți câteva exemple.

S-ar putea să fi înțeles puțin greșit acest cod din moment ce nu am explicat încă care sunt compilatorul, constantele etc. Mai târziu, în timpul antrenamentului, vă voi spune totul, deși ar fi trebuit să fac asta mai devreme. Și acum vreau să descriu ce reguli ar trebui să aibă numele de variabile.

  • Numele de variabile nu pot începe cu un număr; nu pot folosi aritmetica sau simboluri în numele lor. operatori logici, precum și simbolul „#”.
  • Utilizarea caracterelor „$” sau „_” este acceptabilă, inclusiv prima poziție și numele.
  • O variabilă de tip primitiv declarată ca membru al clasei (variabilă globală) este setată implicit la zero.
  • Dacă o variabilă este declarată ca variabilă locală într-o metodă, aceasta trebuie inițializată înainte de utilizare. Deoarece variabilele locale nu sunt inițializate implicit. Aceasta înseamnă că nu puteți declara o variabilă locală și nu o puteți lăsa neinițializată. Adica asa: int i;. Dacă faceți acest lucru într-o metodă, compilatorul vă va cere să setați o valoare implicită, în timp ce atunci când creați o astfel de variabilă ca membru al clasei (global), compilatorul însuși o va seta la 0.
  • Sfera și durata de viață a unei variabile este limitată de blocul () în care este declarată. Dacă ați creat o variabilă în interiorul unei metode (cum am făcut în exemple), atunci nu o puteți utiliza în afara metodei, deoarece metoda este delimitată de paranteze (). Variabila globală este vizibilă în toate blocurile.
  • De asemenea, este interzisă utilizarea rezervată cuvinte java. Lista plina Cuvinte cheie se vede in poza de mai jos.

Și întrucât în ​​acest articol am atins expresia operator binar, îmi propun să luăm în considerare operatorii în Java. În plus, nu există prea multă teorie.

Java are mai multe tipuri de operatori: alocare simplă, aritmetică, unară, egală și relațională, condițională, comparație de tip, bitwise și bitshift.

Există o mulțime de cuvinte inteligente, dar această imagine explică totul foarte simplu:

La început vom folosi operatori de comparare, de atribuire și postfix pe biți. Alți operatori nu sunt atât de obișnuiți, așa că îi vom lua în considerare doar pe cei pe care îi vom folosi.

    Clasa publică OperatorsInJava (

    int a = 5 ;

    int b = 6 ;

    int suma = a + b;

    int diferenta = a - b;

1. Ce este explicit și turnare automată tipuri de expresii?

Turnarea tipului poate fi explicită sau automată.

Cu turnarea de tip explicit, operația de turnare în sine este specificată în mod explicit.

Când se efectuează turnarea de tip automat, trebuie îndeplinite două condiții:

  • ambele tipuri trebuie să fie compatibile;
  • lungime tip original(tipul sursei) trebuie să fie mai mică decât lungimea tipul tinta(tip receptor).

2. Cum arată turnarea de tip explicit în expresii? Exemple

Castingul explicit de tip permite alocarea de tipuri incompatibile. Forma generală O distribuție de tip explicit arată astfel:

(tip_țintă) valoare

tip_țintă– acesta este tipul la care doriți să turnați conținutul specificat sens.

Exemple turnare de tip explicit.

// turnarea explicită a tipului în expresii octetul b; int a; dublu d; plutitor f; d = -39,9203; a = (int )d; // a = -39 f = (float )d; // f = -39,9203 b = (octet )d; // b = -39 d = 302930932; b = (octet )d; // b = -12 - trunchiază valoarea a = -27; b = (octet)a; // b = -27

3. Exemple de turnare tip automat

Exemplul 1. Turnare automată a tipurilor întregi.

// turnare automată a tipurilor întregi int a; octetul b; sh scurt; b = -23; a = b; // a = -23 - turnare de tip automat sh = -150; a = sh; // a = -150 lung l = 200; // Eroare: „Nepotrivire tip: nu se poate converti de la long la int” // a = l; l = b; // l = -23 l = sh; // l = -150 char c = "Z" ; a = c; // a = 90 - cod de caractere „Z” boolean b1 = fals ; //a = b1; - eroare, tipurile sunt incompatibile

Exemplul 2. Turnare automată a tipurilor în virgulă mobilă.

// turnare automată a tipurilor în virgulă mobilă plutitor f; dublu d; f = 3,409033f; d = f; // d = 3,409033

Exemplul 3. Turnare automată tipuri mixte. Acest caz este posibil dacă tip variabil virgulă mobilă i se atribuie valoarea unei variabile de tip întreg.

// turnare automată de tipuri mixte plutitor f; dublu d; a = 28; d = a; // d = 28,0 f = a; // f = 28,0 // Eroare: Tip nepotrivire: nu se poate converti de la float la int // a = f;

4. Cum se face promovarea automată în expresii?

Promovarea tipului automat are loc în expresii. În acest caz, valorile care apar în expresii sunt promovate automat la tipuri cu intervale mari de valori.

Când promovați automat tipurile în expresii:

  • dacă unul dintre operanzii întregi este de tip int, atunci toate valorile de tip byte, short și char sunt promovate la tipul int;
  • dacă unul dintre operanzii întregi este de tip long, atunci întreaga expresie este promovată la tipul long;
  • dacă unul dintre operanzi se referă la tip plutitor, atunci și tipul întregii expresii va fi de tip float (dacă nu există operanzi de tip double);
  • dacă unul dintre operanzi este de tip double, atunci și tipul întregii expresii va fi dublu.

5. Un exemplu de promovare de la un octet la un tip int în care expresia nu conține operanzi variabili tastați int(lung)
// octet -> int octetul b; b = 1000 / 20; // b = 50, funcționează deoarece rezultatul este plasat într-un tip de octet

Exemplul de mai sus funcționează corect deoarece:

  • rezultatul este plasat (compatibil) în tipul octet;
  • fără operanzi de tip int.

În exemplul de mai sus, valoarea 1000 depășește intervalul de valori ale octeților. În primul rând, numărul 1000 este turnat pentru a tasta int. Dar rezultatul

1000 / 20 = 50

este turnat la octet și se poate potrivi corect într-o variabilă b .

Daca o scrii asa:

octetul b; b = 100000 / 20; // eroare deoarece rezultatul nu se încadrează în tipul de octet

atunci va apărea o eroare de compilare cu mesajul:

În acest caz, rezultatul nu este introdus în tipul de octeți:

100000 / 20 = 5000

Apoi acest număr (5000) devine automat un tip int și compilatorul va genera un mesaj de eroare.

Dacă faceți o distribuție de tip explicit:

octetul b; b = (octet) (100000 / 20); // b = -120

apoi în acest caz rezultatul 5000 de tip int se transformă în tip byte. După cum știți, o variabilă de tip int ocupă 32 de biți, iar o variabilă de tip byte ocupă 8 biți. Valoarea unei variabile int este trunchiată. Și avem ceea ce avem (b = -120).

Exemplele de mai sus se aplică și variabilelor de tip short și char.

6. Exemplu. Promovare de la octet la int unde expresia conține un operand variabil int
// promovarea tipurilor în expresii // octet -> int octetul b; int d; d = 20; // eroare, rezultatul este de tip int, deoarece variabila d este de tip int // b = 1000 / d;

În exemplul de mai sus, expresia folosește o variabilă d tastați int. Prin urmare, compilatorul va produce un mesaj de eroare:

Nepotrivire de tip: nu se poate converti de la int la octet

Aceasta înseamnă că rezultatul este un int (nu un octet) chiar dacă valoarea se încadrează în intervalul de valori ale octetului. Deoarece expresia folosește o variabilă operand d tastați int.

Dacă efectuați o distribuție de tip explicit, rezultatul va fi corect:

// promovarea tipurilor în expresii // octet -> int octetul b; int d; d = 20; b = (octet)(1000/d); // b = 50 - funcționează corect

7. Exemplu. Promovare de la int la long

Un exemplu de promovare de tip de la int la long. Dacă unul dintre operanzi este de tip lung, atunci întreaga expresie este promovată la tip lung.

int d; lung; d = 10000 * 200; // lucrări, d = 2000000 // Eroare! Nepotrivire de tip: nu se poate converti de la long la int // d = 1L * 2L; - operanzii 1L și 2L sunt de tip lung l = 100; // eroare, unul dintre operanzi este de tip lung // d = l * 2;

După cum se poate vedea din exemplu, dacă unul dintre operanzi este de tip lung, atunci întreaga expresie devine de tip lung.

Uneori apar situații când ai o valoare a unora anumit tip, dar trebuie să-l alocați unei variabile de alt tip. Pentru unele tipuri, acest lucru se poate face fără turnare de tip; în astfel de cazuri se vorbește despre conversia automată a tipului. În Java, conversia automată este posibilă numai dacă reprezentarea numerică a variabilei de destinație este suficient de precisă pentru a stoca valoarea inițială. O astfel de conversie are loc, de exemplu, când se introduce o constantă literală sau valoarea unei variabile de tip octet sau scurt într-o variabilă de tip int. Se numeste extensie (lărgirea) sau crește (promovare), deoarece un tip de biți mai mici este extins (promovat) la un tip compatibil mai mare. Mărimea tipului int este întotdeauna suficientă pentru a stoca numere din intervalul permis de tipul de octet, deci în situatii similare Nu este necesar un operator de distribuție de tip explicit. Reversul nu este adevărat în majoritatea cazurilor, așa că pentru a atribui o valoare de tip int unei variabile de tip octet, trebuie să utilizați operatorul tip cast. Această procedură este uneori numită îngustare (îngustarea), pentru că îi spuneți în mod explicit traducătorului că valoarea trebuie convertită pentru a se potrivi într-o variabilă de tipul dorit. Pentru a arunca o valoare într-un anumit tip, precedați-o prin specificarea tipului respectiv, cuprins între paranteze. Următorul fragment de cod demonstrează turnarea tipului unei surse (o variabilă int) la tipul unei destinații (o variabilă octet). Dacă, în timpul unei astfel de operații, valoarea întregului se afla în afara intervalului permis pentru tipul de octet, aceasta ar fi redusă prin împărțirea modulo la intervalul permis pentru octet (rezultatul împărțirii modulo cu un număr este restul divizării la acel număr),

int a = 100;
octetb = (octet) a;

2.2.1. Conversie automată a tipurilor în expresii

Când se calculează valoarea unei expresii, precizia necesară pentru stocarea rezultatelor intermediare trebuie să fie adesea mai mare decât cea necesară pentru a reprezenta rezultatul final.

octet a = 40;
octet b = 50;
octet cu = 100;
int d = a* b / c;

Rezultatul expresiei intermediare (a*b) poate fi în afara intervalului de valori permis pentru tipul de octet. Acesta este motivul pentru care Java promovează automat tipul fiecărei părți a unei expresii pentru a tasta int, astfel încât să existe suficient spațiu pentru rezultatul intermediar (a* b).

Conversia automată a tipurilor poate provoca uneori mesaje de eroare neașteptate ale traducătorului. De exemplu, codul prezentat mai jos, deși pare destul de corect, are ca rezultat un mesaj de eroare în timpul fazei de traducere. În el încercăm să scriem valoarea 50*2, care ar trebui să se potrivească perfect în tipul de octet, într-o variabilă de octet. Dar datorită conversiei automate a tipului rezultat în int, primim un mesaj de eroare de la traducător - la urma urmei, atunci când scrieți int în octet, poate apărea o pierdere de precizie.

octet b = 50;
b = b* 2:
^ Tip incompatibil pentru =. Este necesară transformarea explicită pentru a converti int în octet.
(Tip incompatibil pentru =. Este necesară conversia explicităint înoctet)

Text corectat:
octetb = 50;
b = (octet) (b* 2);

ceea ce face ca b să fie setat la valoarea corectă 100.

Dacă o expresie folosește variabile de tipul byte, short și int, atunci tipul întregii expresii este promovat automat la int pentru a evita overflow. Dacă într-o expresie tipul a cel puțin unei variabile este lung, atunci și tipul întregii expresii este ridicat la lung. Amintiți-vă că toate literalele întregi care nu se termină cu un L (sau 1) sunt de tip int.

Dacă o expresie conține operanzi de tip float, atunci tipul întregii expresii este promovat automat la float. Dacă cel puțin unul dintre operanzi este de tip double, atunci tipul întregii expresii este ridicat la dublu. În mod implicit, Java tratează toate literalele în virgulă mobilă ca fiind de tip double. Următorul program arată cum este promovat tipul fiecărei valori dintr-o expresie pentru a se potrivi cu al doilea operand al fiecărui operator binar.

Promovarea clasei (
public static void main (Argumente șir) (
octet b= 42;
char cu= „a’;
pantaloni scurți = 1024;
int i = 50000;
float f = 5,67f;
dublat =.1234;
rezultat dublu = (f*b) + (i/ c) - (d* s);
Sistem, afară. println ((f* b)+ "+ "+ (i / c)+ " -" + (d* s));
Sistem, afară. println("rezultat = "+ rezultat); )
}

Subexpresia f*b este un float înmulțit cu un octet, astfel încât tipul său este promovat automat la float. Tipul următoarei subexpresii i/c (int împărțit la char) este promovat la int. De asemenea, tipul subexpresiei d*s (dublu ori scurt) este promovat la dublu. În următorul pas al calculelor, ne ocupăm de trei rezultate intermediare de tipurile float, int și double. În primul rând, la adăugarea primelor două, tipul int este promovat la float și rezultatul este un float. Când o valoare dublă este scăzută din aceasta, tipul de rezultat este promovat la dublu. Rezultatul final al întregii expresii este o valoare dublă.

Acum că am văzut toate tipurile simple, inclusiv numere întregi, numere reale, caractere și booleeni, să încercăm să le punem pe toate cap la cap. Exemplul de mai jos creează variabile pentru fiecare dintre tipuri simple iar valorile acestor variabile sunt afișate.

clasa SimpleTypes (
public static void main(Argumente șir) (
octet b = 0x55;
s scurt = 0x55ff;
int i = 1000000;
lung l = 0xffffffffL;
char cu= 'a';
float f= .25f;
dublu d = .00001234;
boolean bool = adevărat;
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("car cu=” + s);
System.out.println("float f = " + f);
System.out.println("double d = " + d);
System.out.println("boolean bool =” + bool); )
}

Prin rularea acestui program ar trebui să obțineți rezultatul prezentat mai jos:

octet b = 85
pantaloni scurți = 22015
int i = 1000000
lung 1 = 4294967295
char cu=a
float f = 0,25
dublu d=1,234e-005
boolean boolean = adevărat

Vă rugăm să rețineți că numerele întregi sunt tipărite în notație zecimală, deși am specificat valorile unora dintre ele în notație hexazecimală.

Ultima actualizare: 29.10.2018

Fiecare tip de bază datele ocupă un anumit număr de octeți de memorie. Acest lucru impune o limitare a operațiunilor care le implică Tipuri variate date. Luați în considerare următorul exemplu:

Int a = 4; octet b = a; // ! Eroare

În acest cod vom întâlni o eroare. Deși atât tipul octet cât și tipul int reprezintă numere întregi. Mai mult, valoarea variabilei a, care este atribuită unei variabile de tip byte, se încadrează bine în intervalul de valori pentru tipul byte (de la -128 la 127). Cu toate acestea, întâlnim o eroare în etapa de compilare. Din moment ce în în acest caz,încercăm să atribuim niște date care necesită 4 octeți unei variabile care va lua doar un octet.

Cu toate acestea, programul poate solicita efectuarea unei astfel de conversii. În acest caz, trebuie să folosesc operația de conversie a tipului (operația (()):

Int a = 4; octet b = (octet)a; // conversie tip: de la tipul int la tipul octet System.out.println(b); // 4

Operația de conversie a tipului presupune specificarea între paranteze a tipului la care trebuie convertită valoarea. De exemplu, în cazul operației (byte)a, datele de tip int sunt convertite în tipul octet. Ca rezultat, vom obține o valoare de tip byte.

Conversii explicite și implicite

Când o operațiune implică date tipuri diferite, nu este întotdeauna necesară utilizarea operației de conversie a tipului. Unele tipuri de transformări sunt efectuate implicit, automat.

Conversii automate

Săgețile din figură indică ce tip de conversie pot fi efectuate automat. Săgețile punctate arată conversii automate cu pierdere de precizie.

Produs automat fara probleme transformări în expansiune(largirea) - extind reprezentarea unui obiect în memorie. De exemplu:

Octet b = 7; int d = b; // conversie din octet în int

În acest caz, o valoare de tip byte, care ocupă 1 octet în memorie, este extinsă la tipul int, care ocupă 4 octeți.

Transformările automate extinse sunt reprezentate de următoarele lanțuri:

octet -> scurt -> int -> lung

int -> dublu

scurt -> float -> dublu

char -> int

Conversii automate cu pierdere de precizie

Unele conversii pot fi efectuate automat între tipuri de date de aceeași lățime de biți sau chiar de la un tip de date cu o lățime de biți mai mare la un tip cu o lățime de biți mai mică. Acestea sunt următoarele lanțuri de conversii: int -> float, long -> float și long -> double sunt efectuate fără erori, dar în timpul conversiei putem întâlni pierderi de informații.

De exemplu:

Int a = 2147483647; float b = a; // de la int la float System.out.println(b); // 2.14748365E9

Conversii explicite

Toate celelalte conversii ale tipurilor primitive aplică în mod explicit operația de conversie a tipului. De obicei, acestea sunt conversii de restrângere de la un tip cu o lățime de biți mai mare la un tip cu o lățime de biți mai mică:

Lung a = 4; int b = (int) a;

Pierderea datelor în timpul conversiei

Când folosim conversii explicite, este posibil să întâmpinăm pierderi de date. De exemplu, nu vom avea probleme cu următorul cod:

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

Numărul 5 se încadrează bine în intervalul de valori ale octeților, așa că după conversie variabila b va fi egală cu 5. Dar ce se întâmplă în următorul caz:

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

Rezultatul va fi numărul 2. În acest caz, numărul 258 este în afara intervalului pentru tipul de octet (de la -128 la 127), deci valoarea va fi trunchiată. De ce va fi rezultatul numărul 2?

Numărul a, care este 258, în sistem binar va fi egal cu 00000000 00000000 00000001 00000010 . Valorile octetilor ocupă doar 8 biți de memorie. De aceea reprezentare binară un număr int este trunchiat la dreapta cu 8 cifre, adică 00000010 , care în sistem zecimal dă numărul 2.

Trunchierea numerelor raționale în numere întregi

La convertirea valorilor în virgulă mobilă în valori întregi, partea fracțională este trunchiată:

dublu a = 56,9898; int b = (int)a;

Aici valoarea lui b ar fi 56, chiar dacă 57 ar fi mai aproape de 56,9898. Pentru a evita astfel de incidente, trebuie să utilizați funcția de rotunjire, care este disponibilă în biblioteca matematica Java:

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

Transformări în timpul operațiunilor

Există adesea situații în care este necesar să se utilizeze diverse operații, de exemplu, adăugare și produs, pe valori de diferite tipuri. Unele reguli se aplică și aici:

    dacă unul dintre operanzii operației este de tip double, atunci al doilea operand este convertit în tipul double

    dacă condiția anterioară nu este îndeplinită și unul dintre operanzii operației este de tip float, atunci al doilea operand este convertit în tipul float

    dacă nu sunt îndeplinite condițiile anterioare, unul dintre operanzii operației este de tip long , atunci al doilea operand este convertit în tipul long

    în caz contrar, toți operanzii operației sunt convertiți la tipul int

Exemple de transformări:

Int a = 3; dublu b = 4,6; dublu c = a+b;

Deoarece operația implică o valoare dublă, atât cealaltă valoare este convertită la tipul dublu, cât și suma celor două valori a+b va reprezenta tipul dublu.

Alt exemplu:

Octet a = 3; scurt b = 4; octet c = (octet)(a+b);

Cele două variabile sunt de tip byte și short (nu double, float sau long), așa că atunci când sunt adăugate sunt convertite la tipul int , iar suma lor a+b reprezintă o valoare int. Prin urmare, dacă apoi atribuim această sumă unei variabile de tip octet, atunci trebuie să facem din nou o conversie de tip în octet.

Dacă operațiunile implică date de tip char, atunci acestea sunt convertite în int:

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

Cele mai bune articole pe această temă