Lukas K. schrieb:
> newbie schrieb:
>> dass er dann z.b. 300*256 rechnen und durch 1000 teilt und DANN erst das
>> Ergebnis zuweist.
>
> Ja, das ist auch der Fall, aber der GCC rechnet, wenn man es ihm nicht
> anders sagt mit 16 bit. Deshalb muss man casten.
Immer diese Halbwahrheiten.
Der GCC rechnet, so wie jeder andere C Compiler immer im höchsten an
einer Operation teilnehmenden Datentyp, mindestens jedoch in int.
freq = (overflows * 256) / 1000;
overflows dürfte wohl ein int sein, 256 ist ein int. Also wird eine
int*int Multiplikation gemacht und das Ergebnis ist wieder ein int. Wenn
overflows von Haus aus ein long gewesen wäre, dann würde an dieser
Stelle auch eine long*long Multiplikation durchgeführt. Genauso wenn 256
ein long wäre, was sich durch einen Suffix erzwingen liesse´
overflows * 256L
----
Und da der Teilausdruck overflows * 256 eine int*int Multiplikation ist,
kommt da auch ein int Teilergebnis raus. Damit verbleibt für die
Division, dass ein int durch einen int dividiert wird und das ganze
daher auch als int-Division realisiert wird.
Hätte man geschrieben
(overflows * 256L) / 1000
dann wäre die Division ebenfalls als long-Division gemacht worden.
Warum? Weil der linke Teilausdruck der Division als Ergebnis einer
long*long Multiplikation ebenfalls den Datentyp long hat. Damit steht
aus Sicht der Division die Sache so aus, dass sie einen long durch einen
int dividieren soll, der kleinere der beiden Datentypen wird
entsprechend vergrößert und man landet bei einer long/long Division.
Der GCC rechnet also nicht einfach generell in 16 Bit und wenn man etwas
anderes haben will muss man casten, sondern er hält sich an die
C-Regeln. Und die sind eindeutig: entscheidend ist der Datentyp der
beteiligten Operanden einer Operation.