Variablentyp cast-Problem

Gast #2618224
Hallo,

ich habe ein Problem mit einer Rechnung.
Ich möchte eine Tabelle mit konstanten Faktoren am Anfang des Programms 
errechnen lassen.
ssTabelle wird anfangs mit Werten befüllt (hier 4 Stück als Beispiel), 
die das Programm dann später ausrechnen soll.
Die Array hierfür ist als int16_t definiert, da die Anfangsbefüllung und 
auch die Werte NACH erfolgter Rechnung in ein int16_t passen.
Jetzt kommt es aber bei der Rechnung selbst zu einem Überlauf von 
16-bit, da die Werte zunächst mit 4000 multipliziert werden (damit 
größer als 16-bit) und im Anschluss durch (n*3) geteilt werden. Wird 
durch n*3 geteilt, passen die Zahlen wieder 16-bit.
Allerdings funktioniert das Ganze leider nicht. Es kommt nicht die Zahl 
raus, die rauskommen soll (gebe sie mir auf dem Display aus).
1
#define AnzahlFaktoren   400
2

3
uint16_t n;
4
int16_t ssTabelle [AnzahlFaktoren] = {0,112,114,0};
5
for (n=10; n<AnzahlFaktoren; n++){
6
ssTabelle[n] = (int32_t)(4000*ssTabelle[n])/(n*3);
7
}

Hat jemand einen Lösungsvorschlag?
Wenn ich ssTabelle als int32_t wähle, funktioniert die Rechnung. Wollte 
aber nicht den Speicherplatz vergeuden.

Danke.
Gast
Hallo Stefan,

das funktioniert jetzt.
Wenn du mir jetzt noch kurz erklären könntest, wieso das genau so 
gemacht werden muss, wäre ich dankbar.
Ich dachte c führt die Rechnung immer mit der höchsten Datentyp aus, 
hier durch meinen "gedachten" cast auf (int32_t) also mit 32-bit. Wieso 
muss ich noch das L für long dann an der 4000 anfügen?

Grüße
Sven
Gast
Ok, das ist wohl dann auch die Erklärung, das wenn man das (int32_t) an 
den Anfang stellt, das gesamte Ergebnis gecastet wird, aber die 
Operanden alle 16-bit sind und daher auch in 16-bit gerechnet wird...
Sven schrieb:
> Ich dachte c führt die Rechnung immer mit der höchsten Datentyp aus,
> hier durch meinen "gedachten" cast auf (int32_t) also mit 32-bit.

Ja, aber ...
1
(int32_t)(4000*ssTabelle[n])
... wo ist denn hier innerhalb der Klammer ein int32_t?
Innerhalb der Klammer sind nur int und int16_t, also wird auch die 
Multiplikation in int gemacht. Erst das (bereits übergelaufene) Ergebnis 
wird dann von dir mit dem Cast in ein int32_t konvertiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.