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

Re: Word Overflow Kategorie: Programmierung Basic (von ThomasK - 10.09.2012 0:08)
Als Antwort auf Re: Word Overflow von Stefan - 9.09.2012 21:34
Ich nutze:
C-Control Pro Mega128
> > > eine simple Rechnung mit Word Variablen führt bei mir
> > > jedesmal ab 2^15 zu Overflow:
> > >
> > > #define Cons  4464
> > >
> > > Sub Test()
> > > Dim W As Word
> > > Dim I As Integer
> > >     For I = 0 To 11
> > >         W = I * Cons
> > >         W = W / Cons
> > >
> > >         Print_Zahl(W) : Put(Tab) : Print_Zahl(W < 20) : NEWLINE()
> > >     Next
> > > End Sub
> > >
> > > mit dem Ergebnis:
> > >
> > > 0 1
> > > 1 1
> > > 2 1
> > > 3 1
> > > 4 1
> > > 5 1
> > > 6 1
> > > 7 1
> > > 65530 0   ab hier scheint intern ein Integer Overflow einzutreten. Die Word Grenze
> > > 65531 0   ist noch lange nicht erreicht. Das Flag wird ausgegeben, um auszuschliessen
> > > 65532 0   dass der Fehler bei der Zahlendarstellung eintritt.
> > > 65533 0
> > >
> > > Was machen?
> >
> > Beim Versuch eine Umgehungslösung zu finden, fiel mir ein weitere
> > Ungereimtheit auf:
> >
> > #define Cons  4464
> > #define Grenze 31248
> > Sub Test()
> > Dim W As Word
> > Dim B As Byte
> > Dim I As Integer
> >     For I = 0 To 11
> >         W = I * Cons
> >         Print_Zahl(W) : Put(Tab)
> >         B = 0
> >         If W > Grenze Then
> >            B = 1 : W = W - Grenze
> >         End If
> >         W = W / Cons
> >         W = W + 7 * B
> >
> >         Print_Zahl(W) : Put(Tab) : Print_Zahl(B) : NEWLINE()
> >     Next
> > End Sub
> >
> > ergibt:
> > 0 0 0
> > 4464 1 0
> > 8928 2 0
> > 13392 3 0
> > 17856 4 0
> > 22320 5 0
> > 26784 6 0
> > 31248 7 0
> > 35712 65530 0   Ab hier wieder falsch, "W > Grenze" wird nicht erkannt
> > 40176 65531 0
> > 44640 65532 0
> > 49104 65533 0
> >
> > Anscheinend verwaltet der Compiler das Word Format intern wie Integer
> >
> > Weiterer Test:
> > #define Cons  4464
> > #define Grenze 31248
> > Sub Test()
> > Dim W As Integer
> > Dim B As Byte
> > Dim I As Integer
> >     For I = 0 To 11
> >         W = I * Cons
> >         Print_Zahl(W) : Put(Tab)
> >         B = 0
> >         If W < 0 Then
> >            B = 1 : W = W - Grenze
> >         End If
> >         W = W / Cons
> >         W = W + 7 * B
> >
> >         Print_Zahl(W) : Put(Tab) : Print_Zahl(B) : NEWLINE()
> >     Next
> > End Sub
> >
> > Hier ist W vom Format Integer und es wird bewusst auf Overflow (W < 0) abgefragt.
> > Das Ergebnis in diesem Fall ist richtig.
> > 0 0 0
> > 4464 1 0
> > 8928 2 0
> > 13392 3 0
> > 17856 4 0
> > 22320 5 0
> > 26784 6 0
> > 31248 7 0
> > 35712 8 1
> > 40176 9 1
> > 44640 10 1
> > 49104 11 1
> >
> > Frage: Wie kann ich mit Word Variablen bei Werten > 2^15 richtig rechnen, vergleichen?
>
> Fehler: Natürlich sind es die Werte > 2^14 und < 2^15 mit denen ich rechnen will.$

Laut Handbuch (Kapitel 5.3.4, Compiler->Basic->Variabeln) gilt für Zahlen ohne
Dezimalpunkt und Exponent, dass sie vom Typ Integer mit Vorzeichen sind. Und da
Operationen, in denen vorzeichenlose mit vorzeichenbehafteten Zahlen gemischt
werden mit Vorzeichen berechnet werden, sieht die Rechnung zum Beispiel für
i=8 so aus:


W = 8 * 4464 ' W = 35712
W = -29824 / 4464 ' = -6 = 65530


(-29824 ist dasselbe Bitmuster wie 35712, nur als vorzeichenbehaftete Zahl
interpretiert. Ebenso ist -6 dasselbe Bitmuster wie 65530)

Die Lösung: Deine Konstante muss vorzeichenlos sein, also
#define Cons  4464U

Gruss, Thomas


    Antwort schreiben


Antworten:

Re: Word Overflow (von Stefan - 10.09.2012 12:42)