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 - 8.09.2012 9:24)
Als Antwort auf Word Overflow von Stefan - 8.09.2012 7:47
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
> 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?


    Antwort schreiben


Antworten:

Re: Word Overflow (von Stefan - 9.09.2012 21:34)
    Re: Word Overflow (von ThomasK - 10.09.2012 0:08)
        Re: Word Overflow (von Stefan - 10.09.2012 12:42)