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 Stefan - 10.09.2012 12:42)
Als Antwort auf Re: Word Overflow von ThomasK - 10.09.2012 0:08
Ich nutze:
C-Control Pro Mega32
> > > > 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

Danke! das war die Lösung
> > > > 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: