/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
cast int til long
Fra : Søren Jensen


Dato : 10-01-05 13:50

hej der er vil ikke nogen der kan fortælle mig hvad jeg gør gal.


signde long SL_var
signed int SI_var = 40000;

void main (void)
{

SL_var = 3000000/(signed long)SI_var;


}


og så skulle værdien jo gerne være 75 men den er -117..

på forhånd tak



 
 
Kim Schulz (10-01-2005)
Kommentar
Fra : Kim Schulz


Dato : 10-01-05 14:20

On Mon, 10 Jan 2005 13:49:42 +0100
"Søren Jensen" <x@x.xxx> wrote:

> hej der er vil ikke nogen der kan fortælle mig hvad jeg gør gal.
>
>
> signde long SL_var
> signed int SI_var = 40000;
>
> void main (void)
> {
>
> SL_var = 3000000/(signed long)SI_var;
>
>
> }
>
>
> og så skulle værdien jo gerne være 75 men den er -117..
> på forhånd tak

Nu kommer det lidt an på kompileren du benytter, men jeg ved at i hvert
fald Visual C++ pakker data for int og long forskelligt, så derfor vil
et primitivt cast som dit godt kunne forårsage netop den fejl du nævner.

Men så er det lige at jeg vil nævne at det så er eneste ting som visual
C++ gør forskelligt ved de 2 typer. De er begge 4 bytes i størrelse og
kan indeholde de samme tal.


--
Kim Schulz | Stop Software patents before it is too late!
Geek by nature |
schulz.dk |

Søren Jensen (10-01-2005)
Kommentar
Fra : Søren Jensen


Dato : 10-01-05 14:31


> hej der er vil ikke nogen der kan fortælle mig hvad jeg gør gal.
>
>
> signde long SL_var
> signed int SI_var = 40000;
>
> void main (void)
> {
>
> SL_var = 3000000/(signed long)SI_var;
>
>
> }
>
>
> og så skulle værdien jo gerne være 75 men den er -117..
> på forhånd tak

>Nu kommer det lidt an på kompileren du benytter, men jeg ved at i hvert
>fald Visual C++ pakker data for int og long forskelligt, så derfor vil
>et primitivt cast som dit godt kunne forårsage netop den fejl du nævner.

hvad er der af alternativer til denne primitive cast?



Mogens Hansen (10-01-2005)
Kommentar
Fra : Mogens Hansen


Dato : 10-01-05 16:52


"Søren Jensen" <x@x.xxx> wrote in message
news:41e283cc$0$33618$edfadb0f@dread16.news.tele.dk...

[8<8<8<]
> hvad er der af alternativer til denne primitive cast?

Får du ikke en warning fra din compiler ?

Du brude kunne skrive L efter din litteral for at gøre compileren opmærksom
på at det er en long, og så droppe castet:

SL_var = 3000000L/SI_var;

Venlig hilsen

Mogens Hanen



Bertel Brander (10-01-2005)
Kommentar
Fra : Bertel Brander


Dato : 10-01-05 20:27

Kim Schulz wrote:
> Nu kommer det lidt an på kompileren du benytter, men jeg ved at i hvert
> fald Visual C++ pakker data for int og long forskelligt, så derfor vil
> et primitivt cast som dit godt kunne forårsage netop den fejl du nævner.

Interesant, kan du uddybe det? Hvilke versioner af Visual C++?

Meget gamle versioner har vist 16 bit's int, men de versioner
af visual C++ jeg har brugt (fra 5.0 og frem) har 32 bits int,
og der er der (mig bekendt) ingen forskel på int & long.

--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Ove Kjeldgaard (10-01-2005)
Kommentar
Fra : Ove Kjeldgaard


Dato : 10-01-05 15:24

"Søren Jensen" <x@x.xxx> wrote:

>hej der er vil ikke nogen der kan fortælle mig hvad jeg gør gal.
>
>signed long SL_var
>signed int SI_var = 40000;
>
>void main (void)
>{
> SL_var = 3000000/(signed long)SI_var;
>}
>
>og så skulle værdien jo gerne være 75 men den er -117..
>

Det mest oplagte er at din kompiler opfatter "int" som 16 bit og "long int" som
32 bit variable.

For så passer det med at konstanten 40000 er over hvad en "int" kan være som
positiv tal (0x7FFF svarende til 32767 decimal).

Værdien SI_var får svarer til -25536, og så passer udregningens resultat.

Om kompileren så burde komme med en advarsel, er så en helt anden sag...


Løsningsforslag er jeg lidt i tvivl om, men er der grund til at blande "int" og
"long int" variable?


--
Med venlig hilsen, Ove Kjeldgaard, nospam AT privat DOT dk
Natur og Friluftsliv: <http://hiker.dk>

Søren Jensen (10-01-2005)
Kommentar
Fra : Søren Jensen


Dato : 10-01-05 15:58


"Ove Kjeldgaard" <ReadMyEmail@The.Signature> skrev i en meddelelse
news:t535u0t081scf68gla67mcvs03an6ahj3c@4ax.com...
> "Søren Jensen" <x@x.xxx> wrote:
>
>>hej der er vil ikke nogen der kan fortælle mig hvad jeg gør gal.
>>
>>signed long SL_var
>>signed int SI_var = 40000;
>>
>>void main (void)
>>{
>> SL_var = 3000000/(signed long)SI_var;
>>}
>>
>>og så skulle værdien jo gerne være 75 men den er -117..
>>
>
> Det mest oplagte er at din kompiler opfatter "int" som 16 bit og "long
> int" som
> 32 bit variable.
>
> For så passer det med at konstanten 40000 er over hvad en "int" kan være
> som
> positiv tal (0x7FFF svarende til 32767 decimal).
>
> Værdien SI_var får svarer til -25536, og så passer udregningens resultat.
>
> Om kompileren så burde komme med en advarsel, er så en helt anden sag...
>
>
> Løsningsforslag er jeg lidt i tvivl om, men er der grund til at blande
> "int" og
> "long int" variable?


jeg havde ikke set at min værdi på 40000 var mere end hvad en signed int
kunne håndterer.

tak for hjælpen




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste