5.3.1 Unsigned integers

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
  unsigned(kind=8) :: v
  v = huge(v) - 32u_8
  print *,v
end program main

which will output the number 18446744073709551583.

Arithmetic operations work on unsigned integers, except for exponentiation, which is prohibited. Unary minus is not permitted when -pedantic is in force; this prohibition is part of J3/24-116.txt.

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 which would overflow are rejected with -pedantic.

As of now, the following intrinsics take unsigned arguments:

This list will grow in the near future.