Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: long Arithmetik Bug(?) - ist kein Bug Kategorie: Programmierung (von André H. - 3.01.2003 16:01)
Als Antwort auf long Arithmetik Bug(?) von Reto - 3.01.2003 14:36

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 :
Integer mal Integer ergibt wieder einen Integer
Ist ein Longwert in der Berechnung, kommt auch wieder Long heraus,
genauso ist es bei float.
Bsp:
long mal int ergibt long
float mal int ergibt float
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:

float f;
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: ERROR    l = 20864
>
> Bemerkung:
> 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.
>
>
> Fragen:
> - 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:

Re: long Arithmetik Bug(?) - ist kein Bug (von Reto - 3.01.2003 16:32)