Forum: Compiler & IDEs warum Überlauf?


von Walter (Gast)


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

von johnny.m (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Walter (Gast)


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

von Rolf Magnus (Gast)


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).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Walter (Gast)


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 )

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.