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:

`BLT`

,`BLE`

,`BGE`

and`BGT`

. These intrinsics are actually redundant because comparison operators could be used directly.`IAND`

,`IOR`

,`IEOR`

and`NOT`

`BIT_SIZE`

,`DIGITS`

and`HUGE`

`DSHIFTL`

and`DSHIFTR`

`IBCLR`

,`IBITS`

and`IBSET`

`MIN`

and`MAX`

`ISHFT`

,`ISHFTC`

,`SHIFTL`

,`SHIFTR`

and`SHIFTA`

.`MERGE_BITS`

`MOD`

and`MODULO`

`MVBITS`

`RANGE`

`TRANSFER`

`SUM`

,`PRODUCT`

,`MATMUL`

and`DOT_PRODUCT`

`IANY`

,`IALL`

and`IPARITY`

`RANDOM_NUMBER`

`CSHIFT`

and`EOSHIFT`

`FINDLOC`

`MAXVAL`

and`MINVAL`

.

This list will grow in the near future.