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:
BGE, see BGE
BGT, see BGT
BIT_SIZE, see BIT_SIZE
BLE, see BLE
BLT, see BLT
CMPLX, see CMPLX
CSHIFT, see CSHIFT
DIGITS, see DIGITS
DOT_PRODUCT, see DOT_PRODUCT
DSHIFTL, see DSHIFTL
DSHIFTR, see DSHIFTR
EOSHIFT, see EOSHIFT
FINDLOC, see FINDLOC
HUGE, see HUGE
IALL, see IALL
IAND, see IAND
IANY, see IANY
IBCLR, see IBCLR
IBITS, see IBITS
IBSET, see IBSET
IEOR, see IEOR
INT, see INT
IOR, see IOR
IPARITY, see IPARITY
ISHFT, see ISHFT
ISHFTC, see ISHFTC
MATMUL, see MATMUL
MAX, see MAX
MAXLOC, see MAXLOC
MAXVAL, see MAXVAL
MERGE, see MERGE
MERGE_BITS, see MERGE_BITS
MIN, see MIN
MINLOC, see MINLOC
MINVAL, see MINVAL
MOD, see MOD
MODULO, see MODULO
MVBITS, see MVBITS
NOT, see NOT
OUT_OF_RANGE, see OUT_OF_RANGE
PRODUCT, see PRODUCT
RANDOM_NUMBER, see RANDOM_NUMBER
RANGE, see RANGE
REAL, see REAL
SHIFTA, see SHIFTA
SHIFTL, see SHIFTL
SHIFTR, see SHIFTR
SUM, see SUM
TRANSPOSE, see TRANSPOSE
TRANSFER, see TRANSFER
The following intrinsics are enabled with -funsigned:
UINT, see UINT
UMASKL, see UMASKL
UMASKR, see UMASKR
SELECTED_UNSIGNED_KIND, see SELECTED_UNSIGNED_KIND
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.