Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Neue Beta (Long Integer) Kategorie: Programmierung C (von PeterS - 30.08.2010 17:19)
Als Antwort auf Re: Neue Beta (Long Integer) von UKo - 30.08.2010 16:53

> > > Hallo Peter,
> > > ich war richtig happy, dass die neue beta jetzt long Variablen anbietet.
> > > Ich gehe mal davon aus, dass bei long-Ausdrücken int oder word Anteile in long gewandelt werden.
> > > Die Hilfe sagt dazu (noch?) nix.
> > > Das scheint aber nur manchmal zu funktionieren.
> > >
> > > folgendes geht nicht:
> > >   long L;
> > >   word W;
> > >
> > >   W=15;
> > >   L= 20000 + W * 1000;          ==> ergibt -30536
> > > -------------------------------------
> > > so geht es:
> > >   long L;
> > >   word W;
> > >
> > >   W=15;
> > >   L= 20000;
> > >   L= L + W * 1000;          ==> ergibt 35000
> > > ------------------------------------
> > > so geht es auch:
> > >   unsigned long L;
> > >   word W;
> > >
> > >   W=15;
> > >   L= 20000;
> > >   L= L + W * 1000;          ==> ergibt auch 35000
> > > ------------------------------------------
> > > Gruss
> > > Ulrich
> >
> > Hallo Ulrich,
> >
> > der default ist (wie bei C auch) immer int. Wenn bei der Arithmetik einer der beiden
> > Operanden einen "höheren" Typ hat, wird es in long umgewandelt. Dies ist bei
> > "20000 + W * 1000" aber nicht der Fall. Der Ausdruck funktioniert dann, wenn entweder W
> > vom Typ long ist, oder Du 1000L oder 20000L bei ein der der Konstanten schreibst.
> >
> > So wird aber "20000 + W * 1000" als integer Ausdruck ausgewertet und dann einem long
> > zugewiesen.
> >
> > Gruss Peter
>
> Hallo Peter und Jörg,
> Danke für die Hinweise!
> Der Ausdruck lautete im Original:
>
>          respLong = ascWord(response[1])*16 + ascWord(response[2]);
>          if (i >= 6){
>            respLong=respLong + ascWord(response[3])* 4096 + ascWord(response[4])* 256;
>          }
>          if (i == 8) {
>            respLong=respLong + ascWord(response[5])* 1048576 + ascWord(response[6]) * 65536;
>          }
>
> ascWord wandelt ein ASCII char in ein word
> respLong ist vom Typ long.
>
> Frage: Ist es jetzt ausreichend in  e i n e m  der Summanden pro Zeile hinter die Konstante
> (z.B. 4096) ein l zu schreiben oder muss das bei jedem Summanden so sein( auch 256l)?
>
> Gruss Ulrich

Da "*" Prezedenz über "+" hat, mu� das "L" bei 4096 und 256 sein. Eleganter wird ascWord zu
ascLong. 65536 und 1048576 werden natürlich automatisch in longs verwandelt.

Gruss Peter


    Antwort schreiben


Antworten:

Re: Neue Beta (Long Integer) (von UKo - 30.08.2010 18:12)