Integer
 
Standard data type: 32-bit or 64-bit signed, same size as SizeOf(Any Ptr)

Syntax

Dim variable As Integer
Dim variable As Integer<bits>

Parameters

bits
A numeric constant expression indicating the size in bits of integer desired. The values allowed are 8, 16, 32, 64 or 128.

Description

Integer is the main data type FreeBASIC uses for integer math and bitwise operations. It is the default type for number literals.

In the first form Integer is a 32-bit or 64-bit signed whole-number data type, depending on the target platform.

If an explicit bit size is given (the second form), the data type uses the requested signed integer width. Integer<128> holds values from -2^127 through 2^127-1. The selected data type is Byte for Integer<8>, Short for Integer<16>, Long for Integer<32> and LongInt for Integer<64>. Integer<128> is a distinct 16-byte scalar type.

LLVM emits native i128 arithmetic and bitwise operations; ABS and SGN use the two-word runtime helper. On 32-bit targets, LLVM also uses runtime helpers for conversions between floating-point values and 128-bit integers. GCC and Clang use native `int128` on targets that support it, with ABS and SGN using that same helper. On 32-bit targets, they use a two-word type and lower arithmetic through the runtime. Its alignment is 16 bytes except on Windows CE (8 bytes) and classic m68k targets (2 bytes). C interop must use that structure layout; a native `int128` declaration is compatible only when the compiler supports it and uses a matching ABI.

On 32-bit Windows, the GAS backend keeps the four-byte stack ABI for local variables. UDT field offsets still use 16-byte alignment, but C code receiving a pointer to such a local must accept its four-byte alignment. The runtime helpers accept unaligned storage.

The native GAS and GAS64 backends lower arithmetic through the runtime library. GAS32 passes 128-bit arguments as 16-byte stack copies and returns values through a hidden result pointer, matching the i386 ABI for the aligned two-word C structure. GAS64 uses the SysV two-register ABI where available and stack arguments when those registers are exhausted. The GAS64 non-SysV path passes the 16-byte value through a caller-owned copy and returns through a hidden result pointer.

Example

#ifdef __FB_64BIT__
    Dim x As Integer = &H8000000000000000
    Dim y As Integer = &H7FFFFFFFFFFFFFFF
    Print "Integer Range = "; x; " to "; y
#else
    Dim x As Integer = &H80000000
    Dim y As Integer = &H7FFFFFFF
    Print "Integer Range = "; x; " to "; y
#endif


Dialect Differences

  • In the -lang fb and -lang fblite dialects, the Integer data type is 32-bit or 64-bit depending on target platform
  • In the -lang qb dialect, the Integer data type is 16-bit, regardless of platform.

Differences from QB

  • The ability to select a bit size is new to FreeBASIC
  • The INTEGER type is always 16 bits wide in QB.

See also