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
|