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
— Bitwise greater than or equal to
BGT
, see BGT
— Bitwise greater than
BIT_SIZE
, see BIT_SIZE
— Bit size inquiry function
BLE
, see BLE
— Bitwise less than or equal to
BLT
, see BLT
— Bitwise less than
CMPLX
, see CMPLX
— Complex conversion function
CSHIFT
, see CSHIFT
— Circular shift elements of an array
DIGITS
, see DIGITS
— Significant binary digits function
DOT_PRODUCT
, see DOT_PRODUCT
— Dot product function
DSHIFTL
, see DSHIFTL
— Combined left shift
DSHIFTR
, see DSHIFTR
— Combined right shift
EOSHIFT
, see EOSHIFT
— End-off shift elements of an array
FINDLOC
, see FINDLOC
— Search an array for a value
HUGE
, see HUGE
— Largest number of a kind
IALL
, see IALL
— Bitwise AND of array elements
IAND
, see IAND
— Bitwise logical and
IANY
, see IANY
— Bitwise OR of array elements
IBCLR
, see IBCLR
— Clear bit
IBITS
, see IBITS
— Bit extraction
IBSET
, see IBSET
— Set bit
IEOR
, see IEOR
— Bitwise logical exclusive or
INT
, see INT
— Convert to integer type
IOR
, see IOR
— Bitwise logical or
IPARITY
, see IPARITY
— Bitwise XOR of array elements
ISHFT
, see ISHFT
— Shift bits
ISHFTC
, see ISHFTC
— Shift bits circularly
MATMUL
, see MATMUL
— matrix multiplication
MAX
, see MAX
— Maximum value of an argument list
MAXLOC
, see MAXLOC
— Location of the maximum value within an array
MAXVAL
, see MAXVAL
— Maximum value of an array
MERGE
, see MERGE
— Merge variables
MERGE_BITS
, see MERGE_BITS
— Merge of bits under mask
MIN
, see MIN
— Minimum value of an argument list
MINLOC
, see MINLOC
— Location of the minimum value within an array
MINVAL
, see MINVAL
— Minimum value of an array
MOD
, see MOD
— Remainder function
MODULO
, see MODULO
— Modulo function
MVBITS
, see MVBITS
— Move bits from one integer to another
NOT
, see NOT
— Logical negation
OUT_OF_RANGE
, see OUT_OF_RANGE
— Range check for numerical conversion
PRODUCT
, see PRODUCT
— Product of array elements
RANDOM_NUMBER
, see RANDOM_NUMBER
— Pseudo-random number
RANGE
, see RANGE
— Decimal exponent range
REAL
, see REAL
— Convert to real type
SHIFTA
, see SHIFTA
— Right shift with fill
SHIFTL
, see SHIFTL
— Left shift
SHIFTR
, see SHIFTR
— Right shift
SUM
, see SUM
— Sum of array elements
TRANSPOSE
, see TRANSPOSE
— Transpose an array of rank two
TRANSFER
, see TRANSFER
— Transfer bit patterns
The following intrinsics are enabled with -funsigned:
UINT
, see UINT
– Convert to UNSIGNED
type
UMASKL
, see UMASKL
— Unsigned left justified mask
UMASKR
, see UMASKR
— Unsigned right justified mask
SELECTED_UNSIGNED_KIND
, see SELECTED_UNSIGNED_KIND
— Choose 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
.