Re: long Arithmetik Bug(?) - ist kein Bug Kategorie: Programmierung (von Reto - 3.01.2003 16:32) | |
Als Antwort auf Re: long Arithmetik Bug(?) - ist kein Bug von André H. - 3.01.2003 16:01
| |
Hallo André Danke für die rasche Antwort. Na ja, ich kann's wohl nachvollziehen, grosse Freude kommt aber trotzdem nicht auf ;-) Ich merke einfach immer mehr, dass ich in einer andern (Software-) Welt bin. Bisher habe ich meist mit einer sehr robusten Programmiersprache (Ada) gearbeitet, welche den Programmierer bereits bei der Compilation auf möglichst viele Fehler hinweist. In meinem Besipiel würde das bedeuten, dass wenn ich einen long-Wert erwarte, der Compiler nicht einfach frisch und froh einen Integer-Operation ausführt sondern mich zumindest darauf hinweist, dass ich - entweder als Resultat auch einen int-Wert vorsehen muss - oder auf einem der Operanden bzw. der Operation selbst ein "type cast" nach "long" ausführen muss. Aber ich weiss schon, C2 (wie auch C) ist da sehr viel "flexibler", indem irgendwie irgendwas "zusammen-operiert" wird und dann als irgendetwas anderes zurückkommt. // Etwas böse ausgedrückt... Na ja, auf jeden Fall vielen Dank für Deine Erklärung. Nebenbei: Wie würdest Du mein Problem elegant lösen? - Kann man bei einer const-Definition den Datentyp (z.B. long) erzwingen? - Gibt es ein Type Casting in C2 oder muss ich eine Funktion schreiben a là function to_long(int i) returns long { long l; l = i; return l; }; - Oder sonst eine Idee? Gruss & Happy New Year Reto > Hallo Reto, > > Das ist kein Bug, sondern normal und logisch. :-) > (Wenn man wei� wie eine Berechnung bei der CC2 funzt) > > Wenn Du zwei Integerwerte miteinander multiplizierst, kommt auch wieder > ein Integerwert raus. > Kurz : > > Ist ein Longwert in der Berechnung, kommt auch wieder Long heraus, > genauso ist es bei float. > Bsp: > > > Das ganze gilt natürlich nicht nur für Muliplikation, sondern auch für alle > anderen Operatoren. > > Willst Du also einen Float-Wert bei der Berechnug von zwei nicht floats > erhalten, so mu�t du vorher mindestens einen Wert vorher in einer Float-Var > speichern: > > > int i,j; > > f=i; > f=f*j > > Oder nur mit Long: > > long l; > int i,j; > > l=i; > l=l*j > > > Das hat hoffentlich etwas Licht ins Dunkle gebracht. :-) > > MfG André H. > > > > Beim Rechnen mit verschiedenen Integer-Formaten im Zusammenhang mit > > einem Date/Time Modul habe ich folgenden Bug(?) entdeckt: > > > > Example: > > > > const SECONDS_PER_HOUR = 3600; > > long seconds_per_hour; > > int h; > > long l; > > > > // Init > > seconds_per_hour = SECONDS_PER_HOUR; > > h = 24; > > > > // 3 different ways of the same "long" operation > > // > > l = SECONDS_PER_HOUR * 24; // case 1: correct, l = 86400 > > l = seconds_per_hour * h; // case 2: correct, l = 86400 > > > > // but... > > l = SECONDS_PER_HOUR * h; // case 3: > > > > > > Es scheint, dass die long-Arithmetik im Fall 3 fehl schlägt. Anstatt eine long-Operation > > auszuführen, wird vermutlich eine int-Operation gemacht und anschliessend ein long-Wert > > zurückgegeben. > > > > Komischerweise funktioniert's, wenn die beiden Operanden (SECONDS_PER_HOUR, 24) vom Typ > > int (oder einer sogar byte?) sind (Fall 1). > > > > Es funktioniert einigermassen logischerweise auch (Fall 2), wenn die eine "Konstante" > > zuerst einer long-Variable zugewiesen wird. > > > > > > > > - Weiss jemand eine Erklärung oder findet das Verhalten gar logisch? > > - Muss bei long-Operationen wirklich immer explizites "type casting" angewendet > > werden (das ja eigentlich nicht einmal in C2 enthalten ist)? > > > > Danke für Eure Unterstützung > > Reto | |
Antwort schreiben Antworten: |