Prozentrechnen und konvertieren

Hallöle,

Ich habe in meinem großen Programm (etwa 40kb) eine kleine Aufgabe die mich ärgert:

Eine Int Variable soll um einen variablen Prozentsatz runter gerechnet werden.
Probiert erst so:

Int_a // Wertebereich -512 bis 512;
Int_b // Wertebereich 1 - 100;
Int_a = (Int_a * Int_b)/100;

Dummerweise kommt da im Zwischenschritt im Extremfall mehr raus (51200) als ein Int vertragen kann (32767), irgendwas um die -14000, das Programm macht dort halt komische Sachen, klar. Wie kann ich das Problem am elegantesten umschiffen? Int_a kommt als Int da an und wird auch als Int weiter benötigt, ein hin und her rechnen in Long würde ich mir gerne verkneifen.

Bonusfrage: Beim rechnen mit verschiedenen Variablentypen, kann man da auch gewisse Rechnungen ohne Konvertierung durchführen?

Ich meine zB sowas: Long = Long + Int;
Oder auch so: Int = Int * Byte;
Oder für oben halt:
Long_z = long(Int_a);
Long_z = (Long_z * Int_b)/100;
Int_a = int(Long_z);

Oder muss das wirklich IMMER und ÜBERALL mit long(x); int(x); usw umgerechnet werden?

Danke und Grüße

Das wurde hier kürzlich beantwortet:
http://forum.arduino.cc/index.php?topic=181755.msg1347196#msg1347196

Ich zitiere:

Wenn Du intint rechnest, ist das Ergebnis int.
Wenn Du int
long rechnest, ist das Ergebnis long.
Wenn Du int*float rechnest, ist das Ergebnis float.
Das Ergebnis einer Rechnung entspricht vom Datentyp her immer dem mit der Zahl mit dem größten Wertebereich, die in der Rechnung verwendet wird.

Das hier geht auch ohne Cast:

int i = 1;
long l = i;

Die expliziten Casts brauchst du nur wenn entweder die Datentypen absolut nicht zusammen passen oder der Datenbereich einer Zwischenrechnung nicht ausreicht.

Du kannst also sowas machen:

int i1;
int i2;
long result = (long)i1 * i2 / 100;

Dadurch hast du dann im Zwischenergebnis einmal long und der Bereich sollte dadurch erweitert sein.

Für Literale kannst du auch einfach "L" hintendran schreiben. z.B.:

long result = i * 4000L;

Sijjim:
rechnen in Long würde ich mir gerne verkneifen.

Was hast Du denn gegen ein
Int_a = ((long)Int_a * Int_b)/100;
?

Sijjim:
Bonusfrage: Beim rechnen mit verschiedenen Variablentypen, kann man da auch gewisse Rechnungen ohne Konvertierung durchführen?

http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Einführung_in_C%2B%2B/_Rechnen_mit_unterschiedlichen_Datentypen

Im Endeffekt entspricht beim Rechnen mit zwei Zahlen verschiedener Datengröße das Ergebnis immer der größeren Datengröße, bzw. beim Rechnen mit Ganzzahl und Gleitkommazahl ist das Ergebnis vom Typ Gleitkommazahl.

Vielen Dank euch beiden.

jurs:
Was hast Du denn gegen ein
Int_a = ((long)Int_a * Int_b)/100;
?

Nichts, seit ich weiß wie einfach das ist XD
Code repariert in 2 Minuten 8) und gut zu wissen, das es generell so locker ist.

Problem gelöst, vielen Dank