Note that the result of t2 - t1 is TDateTime and no operator has been defined to multiply int with TDateTime, In this circumstance compiler applies unwanted conversions/casts. Both of operands have been casted to Variant and this global scope operator is called (int on left):
Variant __fastcall operator *(int lhs, const Variant& rhs)
{
return Variant(lhs).operator *(rhs);
}
I recommend you to prevent unwanted casts by specifing operand type, thus you should change the expression as:
int x = 2 * (t2 - t1).Val;
or
int x = 2 * (int)(t2 - t1);
or
int x = 2 * (t2.Val - t1.Val); // best, minimum assembly is generated