Integer kommt bis ~2.100t, Cardinal bis ~4.300t und Int64 bis ~9,2Gt
Mein Punkt ist im Kern: Ich denke du machst dir unnötig viel Arbeit, wenn du Umrechnungen von jedem Typ in jeden anderen manuell herunterschreibst. Such dir ein geeignetes Zwischenformat, in das du jeden Wert konvertierst, bevor du Vergleiche und Rechenoperationen durchführst. Das wird dir viel Schreibarbeit und viel Fehlerpotenzial ersparen. In meinem Beispiel war das Zwischenformat Gramm.
Evtl. ist es auch sinnvoll, einen Record mit Wert und Umrechnungsfaktor zu verwenden. Dadurch könntest du enorm große Zahlen vermeiden. Beispiel:
Delphi-Quellcode:
TWeightValue = record
Value: Integer;
Factor: Integer;
end;
// ...
var
CarWeight, ContainerShipWeight, LoadedContainerShipWeight: TWeightValue;
begin
CarWeight.Value := 1500;
CarWeight.Factor := 1000; // value in kg
ContainerShipWeight.Value := 2000;
ContainerShipWeight.Factor := 1000*1000; // value in tonnen
LoadedContainerShipWeight:= ContainerShipWeight + (CarWeight * 500); // Schiff ist mit 500 Autos voll beladen
Assert(LoadedContainerShipWeight.Value, 2750);
Assert(LoadedContainerShipWeight.Factor , 1000*1000);
end;
In dem Fall bräuchtest du nur einen Record-Typen und müsstest nur jeweils einen Operatoren für die Verwendung mit einem anderen TWeightValue und einem Integer schreiben. Das lässt sich dann auch deutlich einfacher testen.