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 | ||
| ||
> > > 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) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum