5.3.1 Unsigned integers

If the -funsigned option is given, GNU Fortran supports unsigned integers according to J3/24-116. The data type is called UNSIGNED. For an unsigned type with n bits, it implements integer arithmetic modulo 2**n, comparable to the unsigned data type in C.

The data type has KIND numbers comparable to other Fortran data types, which can be selected via the SELECTED_UNSIGNED_KIND function.

Mixed arithmetic, comparisons and assignment between UNSIGNED and other types are only possible via explicit conversion. Conversion from UNSIGNED to other types is done via type conversion functions like INT or REAL. Conversion from other types to UNSIGNED is done via UINT. Unsigned variables cannot be used as index variables in DO loops or as array indices.

Unsigned numbers have a trailing u as suffix, optionally followed by a KIND number separated by an underscore.

Input and output can be done using the ‘I’, ‘B’, ‘O’ and ‘Z’ descriptors, plus unformatted I/O.

Here is a small, somewhat contrived example of their use:

program main
  use iso_fortran_env, only : uint64
  unsigned(kind=uint64) :: v
  v = huge(v) - 32u_uint64
  print *,v
end program main

which outputs the number 18446744073709551583.

Arithmetic operations work on unsigned integers, also for exponentiation. As an extension to J3/24-116.txt, unary minus and exponentiation of unsigned integers are permitted unless -pedantic is in force.

In intrinsic procedures, unsigned arguments are typically permitted for arguments for the data to be processed, analogous to the use of REAL arguments. Unsigned values are prohibited as index variables in DO loops and as array indices.

Unsigned numbers can be read and written using list-directed, formatted and unformatted I/O. For formatted I/O, the ‘B’, ‘I’, ‘O’ and ‘Z’ descriptors are valid. Negative values and values that would overflow are rejected with -pedantic.

SELECT CASE is supported for unsigned integers.

The following intrinsics take unsigned arguments:

The following intrinsics are enabled with -funsigned:

The following constants have been added to the intrinsic ISO_C_BINDING module: c_unsigned, c_unsigned_short, c_unsigned_char, c_unsigned_long, c_unsigned_long_long, c_uintmax_t, c_uint8_t, c_uint16_t, c_uint32_t, c_uint64_t, c_uint128_t, c_uint_fast8_t, c_uint_fast16_t, c_uint_fast32_t, c_uint_fast64_t, c_uint_fast128_t, c_uint_least8_t, c_uint_least16_t, c_uint_least32_t, c_uint_least64_t and c_uint_least128_t.

The following constants have been added to the intrinsic ISO_FORTRAN_ENV module: uint8, uint16, uint32 and uint64.