Attiny: Überlauf in Multiplikation

Gast #2602988
Lesenswert?

Hallo,

ich habe noch nicht so viel Erfahrung im Programmieren mit C (WinAVR) 
und dem Attiny und habe mich gewundert, dass folgendes nicht 
funktioniert:


// funktioniert nicht
unsigned short Delta_t = 3000;
unsigned long temp1 = Delta_t * 30;
temp = temp1/(3*3906);

// funktioniert
unsigned short Delta_t = 3000;
unsigned long temp1 = Delta_t * 3;
temp = temp1/(3*391);

Es gibt ein Überlauf in temp1, obwohl ich für das Ergebnis ein unsigned 
long spendiere.
Wenn ich 2 unsigned short miteinander multipliziere, bekomme ich dann 
wieder ein unsigned short oder bekomme ich dann ein unsigned long?

Die Wahrscheinlichkeit, dass es zu einem Überlauf bei der Multiplikation 
von 2 unsigned short Werten kommt ist doch relativ hoch, warum macht der 
Kompiler dann kein unsigned long draus, speziell, wenn ich das Ergebnis 
sogar einem UL zuweise???

Wie gehts denn richtig?

Danke.
Gast #2603004
Lesenswert?

dost0011 schrieb:
> unsigned short Delta_t = 3000;
> unsigned long temp1 = Delta_t * 30;

Dein Überlauf kommt in der zweiten Zeile, das Ergebnis wird nämlich als 
short berechnet und dann erst dem unsigned long zugewiesen. 30 * 3000 = 
90000 passt aber nicht mehr in short -> Überlauf.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren