mikrocontroller.net

Forum: Compiler & IDEs warum Überlauf?


Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgenden Ausdruck der bei der Berechnung wohl überläuft.
Vermutlich bei 65*ring[][]

v = j*(65*ring[nr][ri]-sum) / 16;

v, j, sum sind int32, ring ist uint16

ich dachte da wird bei der Berechnung automatisch erweitert,
in Visual C geht das auch so.

Ist das in C nicht definiert?

Walter

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Klammer steht sum (int32 nach den obigen Informationen). Also
wird der Inhalt der Klammer mit etwas Glück implizit nach int32
gecastet. Das ganze wird mit j (ebenfalls int32) multipliziert. Das
gäbe für v nen int64. Kann also nicht funktionieren. Selbst wenn man
nur mit ring[][] multiplizieren würde, käm ein int48 raus (int32 *
int16 = int48), was auch noch zu viel ist!

Mit impliziten casts sollte es hier keine Probleme geben, da alle
Variablen int sind (mehr oder weniger). Und bitte keine Vergleiche mit
Visual C. Das ist Microsoft. Die machen eh alles anders:-)

Gruß

Johnny

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die machen eh alles anders:-)

Vor allem laufen sie auf einer Maschine, auf der sizeof(int)
einen anderen Wert hat als sizeof(int) für den AVR-GCC.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg:
ich habe die Größen in VisualC natürlich genauso groß gemacht wie in
gcc

@Johnny
da fehlten natürlich noch Informationen:
j geht nur von -32 bis + 32
sum ist maximal int24 groß
der einzige Überlauf den ich mir vorstellen kann ist eben bei 65*ring,
wird das jetzt zur Multiplikation auf int32 gecastet.

Ich versuche jetzt noch mal das Assemblelisting zu checken,
ich könnte zwar auch 65L schreiben, aber mich würde eben interssieren
ob es in C eine Definition gibt wann was gecastet wird

Walter

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> der einzige Überlauf den ich mir vorstellen kann ist eben bei
> 65*ring, wird das jetzt zur Multiplikation auf int32 gecastet.

Du meinst "konvertiert". Sowohl ring als auch 65 sind 16bittig, also
wird die Berechnung in 16bit durchgeführt. Ich bin mir aber nicht
sicher, ob mit oder ohne Vorzeichen, da die Berechnung wohl beides
mischt (65 ist vom Typ int).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habe die Größen in VisualC natürlich genauso groß gemacht wie in
> gcc

Das kannst du nicht.  Der C-Standard verlangt, dass (Teil-)Ausdrücke
minimal als "int" berechnet werden, und du kannst die Größe von
"int"
nicht beeinflussen.  Damit ändern sich aber die Größenbereiche für
Teilausdrücke, sofern sie nicht durch einen Typecast abgeändert
werden.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg,

ok, danke, jetzt verstehe ich

Ich habe gerade das Listing mal durchgeschaut, die Multiplikation mit
65
macht er da also mit 16Bit, bei 65L dann so wie ichs brauche mit 32
Bit.

Geschickt wie er mit 65 multipliziert, würde ich auch in Assembler
nicht besser machen (  x*65 == x + x<<6 )

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.