# Implementation of `Intrinsic` types in f18¶

Intrinsic types are integer, real, complex, character, and logical. All intrinsic types have a kind type parameter called KIND, which determines the representation method for the specified type. The intrinsic type character also has a length type parameter called LEN, which determines the length of the character string.

The implementation of `CHARACTER` type in f18 is described in Character.md.

## Supported TYPES and KINDS¶

Here are the type and kind combinations supported in f18:

INTEGER(KIND=1) 8-bit two’s-complement integer
INTEGER(KIND=2) 16-bit two’s-complement integer
INTEGER(KIND=4) 32-bit two’s-complement integer
INTEGER(KIND=8) 64-bit two’s-complement integer
INTEGER(KIND=16) 128-bit two’s-complement integer

REAL(KIND=2) 16-bit IEEE 754 binary16 (5e11m)
REAL(KIND=3) 16-bit upper half of 32-bit IEEE 754 binary32 (8e8m)
REAL(KIND=4) 32-bit IEEE 754 binary32 (8e24m)
REAL(KIND=8) 64-bit IEEE 754 binary64 (11e53m)
REAL(KIND=10) 80-bit extended precision with explicit normalization bit (15e64m)
REAL(KIND=16) 128-bit IEEE 754 binary128 (15e113m)

COMPLEX(KIND=2) Two 16-bit IEEE 754 binary16
COMPLEX(KIND=3) Two 16-bit upper half of 32-bit IEEE 754 binary32
COMPLEX(KIND=4) Two 32-bit IEEE 754 binary32
COMPLEX(KIND=8) Two 64-bit IEEE 754 binary64
COMPLEX(KIND=10) Two 80-bit extended precisions values
COMPLEX(KIND=16) Two 128-bit IEEE 754 binary128

No double-double quad precision type is supported.

LOGICAL(KIND=1) 8-bit integer
LOGICAL(KIND=2) 16-bit integer
LOGICAL(KIND=4) 32-bit integer
LOGICAL(KIND=8) 64-bit integer

No 128-bit logical support.

### Defaults kinds¶

INTEGER 4
REAL 4
COMPLEX 4
DOUBLE PRECISION 8
LOGICAL 4

#### Modifying the default kind with default-real-8.¶

REAL 8
DOUBLE PRECISION 8
COMPLEX 8

#### Modifying the default kind with default-integer-8:¶

INTEGER 8

There is no option to modify the default logical kind.

Modules compiled with different default-real and default-integer kinds may be freely mixed. Module files encode the kind value for every entity.

## Representation of LOGICAL variables¶

The default logical is `LOGICAL(KIND=4)`.

Logical literal constants with kind 1, 2, 4, and 8 share the following characteristics:
.TRUE. is represented as 1_kind
.FALSE. is represented as 0_kind

Tests for true is integer value is not zero.

The implementation matches gfortran.

Programs should not use integer values in LOGICAL contexts or use LOGICAL values to interface with other languages.

### Representations of LOGICAL variables in other compilers¶

#### Intel ifort / NVIDA nvfortran / PGI pgf90¶

.TRUE. is represented as -1_kind
.FALSE. is represented as 0_kind
Any other values result in undefined behavior.

Values with a low-bit set are treated as .TRUE..
Values with a low-bit clear are treated as .FALSE..

#### IBM XLF¶

.TRUE. is represented as 1_kind
.FALSE. is represented as 0_kind

Values with a low-bit set are treated as .TRUE..
Values with a low-bit clear are treated as .FALSE..