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.