Question

const
  minDriveFreeSpace: Int64 = 1024*1024*1024*99;

and

var
  minDriveFreeSpace: Int64;
begin
  minDriveFreeSpace := 1024*1024*1024*99;

Will emit:

[dcc32 Error] DataStoreLocator.pas(92): E2099 Overflow in conversion or arithmetic operation

Is this a bug or limit of Delphi's max. constant integer values?

Was it helpful?

Solution

You need to cast at least one value on the right side to Int64. For instance, both of these compile perfectly well on XE6:

const
  minDriveFreeSpace = Int64(1024) * 1024 * 1024 * 99;

var
  minDriveFreeSpace2: Int64;
begin
  minDriveFreeSpace2 := Int64(1024)*1024*1024*99;

Note that it can be any one of the rvalues that are cast. For instance, this works equally as well:

const
  minDriveFreeSpace = 1024 * 1024 * 1024 * Int64(99);

This is documented in the Delphi language guide (although rather poorly) - emphasis mine:

In general, arithmetic operations on integers return a value of type Integer, which is equivalent to the 32-bit LongInt. Operations return a value of type Int64 only when performed on one or more Int64 operands. Therefore, the following code produces incorrect results:

var
I: Integer;
J: Int64;
... 
I := High(Integer);
J := I + 1;

To get an Int64 return value in this situation, cast I as Int64:

...
J := Int64(I) + 1;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top