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 UKo - 30.08.2010 18:12)
Als Antwort auf Re: Neue Beta (Long Integer) von PeterS - 30.08.2010 17:19
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > > > 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
Ja, hab ich verstanden. Allerdings könnte ascLong max den Wert 15 ergeben was 'n bisschen
wenig für 'n long ist....
Nochmal Danke für die Tips und überhaupt für lange Integer - das kam aber auch genau zu der Zeit,
als ich das brauchte.
Gruss Ulrich


    Antwort schreiben


Antworten: