Spørsmål til C spesialister

M

minoss

Guest
Hei Jeg har et spørsmål til C spesialister. Jeg finner ikke svar på noen bok. For eksempel: Hvis jeg har en lang int variabel kalt A og jeg gjøre en beregning. A = x * y, og variablene x og y er flyte typer, variabelen A vil bli automatisk konvertert til float. Mitt spørsmål er, hvor lenge er A en float variabel? For hele programtiden, gjør eller den faller tilbake til lange int hvis det er mulig? Hilsen Michael
 
Jeg antar at A ikke kan konverteres til å flyte becaue det er løst når du erklære A var. Kan være du snakker om format hvordan dataene vil bli lagret i A og dette vil bli lagret i flyttall format? Fra andre siden lengden på minnet for å beholde og formatet er kompilatoren og maskin spesifikk. Vennligst ta en titt til kompilatoren for å finne hvordan bytes gjør A okkuperer. Egentlig bra kompilatoren må produsere advarsel når du vil forsøke å gjøre slike oppdrag. Hvis du kompilatoren er ANSI standard spesifikk, ta en titt til ANSI standard var typen konvertering er angitt for lvalue i oppdraget. Vennligst ta en titt til K & R bok klausul 2.7 hvor den typen konvertering er beskrevet. Som lasst eksempel - standard må konsulteres.
 
Prøv å bruke manuell (jeg er ikke sikker på at dette er rette ordet på engelsk) konvertering: usignerte lang A, B, flyte C, C = (float) A + (float) B
 
[Quote = arturt134] Prøv å bruke manuell (jeg er ikke sikker på at dette er rette ordet på engelsk) konvertering: usignerte lang A, B, flyte C, C = (float) A + (float) B [/quote] Dette er også kalt som type casting ... Hilsen
 
foat og lange kan ha ulike formater og type støping kan føre til ødelagte data.
 
flyte og lange int har forskjellige formater. Derfor typen casting er nødvendig.
 
Type casting jeg antar vil fortelle kompilatoren at den må behandle disse dataene som av ulike typer, men det gjør ikke (hvis jeg ikke feil) konvertere data fra ett format til et annet. Det finnes spesielle funksjoner i C-bibliotek (se til 2,7 K & R bok) brukes til å konvertere de fra ett format til et annet.
 
flyte x, y, lang A; .... A = x * y; Koden genereres av C kompilatoren gjør følgende: 1) beregner produktet x * y som en float (ved hjelp av standard flyttall rutine) 2) dette resultatet er konvertert til lang med trunkering (ikke avrunding) og tildelt A. Ingen kontrollen utføres i denne konverteringen, i tilfelle det er overløp kan du få et feil resultat. (Hvis du ønsker avrunding, trenger du A = x * y + 0,5;). Kompilatoren kan generere en advarsel når du utfører denne typen implisitt konvertering fra float til heltall typer (avhengig av kompilatoren og advarselen nivået du har angitt). Hilsen Z
 
Jeg er enig med venner.Hvis du ikke vil at tap av data når typen casting eller konvertering, bør du definere variabler carefully.I anbefaler deg å definere alle av dem som flyter type.Then du kan konvertere og / eller gjøre operasjoner på den. Cheers, Analyzer.
 
Hvis du definerer en som en lang int, så er det fortsatt en lang int. Multiplikasjon er gjort ved hjelp av flyttall, da produktet er konvertert til en lang int og lagres i A. Her er et utdrag fra ANSI spec beskriver konverteringen ... 6.3.1.4 Ekte flytende og heltallet Når en endelig verdien av fast flytende type er konvertert til et heltall annen type enn _Bool er brøk del forkastet (dvs. verdien er avkortet mot null). Dersom verdien av integrert del ikke kan representeres ved heltall type, er virkemåten udefinert.
 
Den beste måten å teste det, er å gjøre noen tester .... Jeg ser på assembler kilden i kompilatoren min (jeg bruker IAR C for AVR): unsigned a, b; flyte c, d, c = a / b; / / første faste punktet divisjon, neste konvertering fast punkt på floating point d = (float) a / (float) b; / / første konvertering av hvert fast punkt variabel til flyttall, neste floting punkt divisjon
 

Welcome to EDABoard.com

Sponsor

Back
Top