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