afectat întrebărilor adresate specialistilor C

M

minoss

Guest
Salut

Am o întrebare pentru a specialistilor C.Eu nu pot găsi un răspuns în orice carte.

De exemplu: Dacă am o variabilă de lungă int numit A şi I a face un calcul.A = x * y; si variabilele x şi y sunt tipurile de float, variabila A va fi convertite automat să plutească.
Întrebarea mea este, cât timp este o variabilă un flotor??

Pentru timpul întreg program, sau nu să cadă înapoi la int lung dacă este posibil?

Cu respect
Mihai

 
Presupun că A nu poate fi convertit să plutească becaue este fix, atunci când declară un var.Mai a fi tu vorbesc despre formatul de modul în care datele vor fi stocate în A şi acest lucru va fi stocate în format floating point?
De partea cealaltă lungimea de memorie pentru a păstra şi formatul acestuia este compilatorului şi maşini specifice.Vă rugăm să aruncaţi o privire la compilator manualul pentru a afla cum se octeţi A ocupa.

De fapt compilator bun trebuie să producă de avertizare, atunci când va încerca să facă acest transfer.

Daca compilator este ANSI specifice standard, să aruncăm o privire la standardul ANSI au fost de conversie de tip este specificată pentru lvalue în misiune.

Vă rugăm să aruncaţi o privire la K & R clauză de carte 2.7 în cazul în care tipul de conversie este descris.

Ca exemplu Lasst - standard trebuie să fie consultate.

 
Încercaţi să utilizaţi manual (nu sunt sigur este acest cuvânt drept în limba engleză) de conversie:

O nesemnat lung, B;
float C;

C = (float) A (float) B

 
arturt134 a scris:

Încercaţi să utilizaţi manual (nu sunt sigur este acest cuvânt drept în limba engleză) de conversie:O nesemnat lung, B;

float C;C = (float) A (float) B
 
PLUTITOR WC şi pe termen lung ar putea avea formate diferite
şi de turnare de tip poate duce la coruperea datelor.

 
float şi lung int formate au diferite.Prin urmare, turnare de tip este necesar.

 
Tip de turnare Presupun că voi spune compilatorului că trebuie să trateze aceste date, ca de alt tip, dar nu (dacă eu nu sunt greşit), conversia datelor de la un format în altul.Există funcţii speciale în biblioteca C (să aruncăm o privire la 2,7 carte K & R), folosite pentru a converti cele de la un format la altul.

 
float x, y;
Un lung;

....
A = x * y;

Codul generat de compilatorul C este următorul text:
1) calculeaza produsul x * y ca un flotor (folosind standardul de rutină în virgulă mobilă)
2) Acest rezultat este convertit în lung prin trunchiere (nu rotunjire) şi a alocat pentru a verifica A. Nu se efectuează în această conversie, iar în caz, nu există o supraaglomerare puteţi obţine un rezultat greşit.(Dacă doriţi rotunjire, aveţi nevoie de o = x * y .5;).
Compilator poate genera un mesaj de avertizare atunci când se efectuează acest tip de conversie implicite de la float la tipurile de număr întreg (în funcţie de compilatorului şi nivelul de avertizare aţi setat).

Cu respect

Z

 
Sunt de acord cu friends.If nu doriţi ca în cazul pierderilor de date de tip turnarea sau conversia, ar trebui să definiţi variabilele dumneavoastră carefully.I recomandam sa definesc toate dintre ele ca flotorului type.Then puteţi să vă convertiţi şi / sau de a face operaţiuni de pe ea.
Noroc,

Analyzer.

 
Dacă definiţi un ca un int lung, atunci acesta rămâne o int lung.Multiplicarea se face utilizand floating point, atunci produsul este convertit într-o int lung şi stocate în A. Aici este un fragment din spec. ANSI care descriu de conversie ...

6.3.1.4 Real plutitoare şi integer
Atunci când o valoare finit de tip real, plutitoare este convertit la un tip de număr întreg, altele decât _Bool, partea fracţionată este aruncat (de exemplu, valoarea este trunchiat spre zero).În cazul în care valoarea parte integrantă nu poate fi reprezentate de tipul integer, comportamentul este nedefinit.

 
Cel mai bun mod de a testa aceasta, este de a face unele teste ....
I-am uita-te la sursa de asamblare în compilator mea (I'm using IAR C pentru AVR):

nesemnat a, b;
float c, d;

c = a / b; / / prima divizie la punct fix, de conversie lângă punct fix la floating point

D = (float) a / (float) b; / / conversie prima de fiecare punct fix variabilă pentru a floating point, următorul punct de floting divizare

 

Welcome to EDABoard.com

Sponsor

Back
Top