# Module Netnumber

    module Netnumber: sig .. end

Binary encodings of numbers

This is the successor of the `Rtypes` module

## Numeric types

    type int4

32 bit signed integer

    type int8

64 bit signed integer

    type uint4

32 bit unsigned integer

    type uint8

64 bit unsigned integer

    type fp4

single precision float (IEEE "float")

    type fp8

double precision float (IEEE "double")

    exception Cannot_represent of string

raised if a conversion can't be done

    exception Out_of_range

raised if string position out of range

## Basic encoding/decoding functions

    val mk_int4 : char * char * char * char -> int4

    val mk_int8 : char * char * char * char * char * char * char * char -> int8

    val mk_uint4 : char * char * char * char -> uint4

    val mk_uint8 : char * char * char * char * char * char * char * char -> uint8

`mk_`<t> create integer values from character tuples. In these tuples the MSB is the first component and the LSB the last.

    val dest_int4 : int4 -> char * char * char * char

    val dest_int8 : int8 -> char * char * char * char * char * char * char * char

    val dest_uint4 : uint4 -> char * char * char * char

    val dest_uint8 : uint8 -> char * char * char * char * char * char * char * char

`dest_`<t> destroy integer values and returns the corresponding char tuples.

    val mk_fp4 : char * char * char * char -> fp4

    val mk_fp8 : char * char * char * char * char * char * char * char -> fp8

    val dest_fp4 : fp4 -> char * char * char * char

    val dest_fp8 : fp8 -> char * char * char * char * char * char * char * char

## Conversions

Conversions from int to (u)int and vice versa. On 32-bit computers, the type `int` can hold 31-bit signed integers (including the sign, i.e. one bit cannot be used). On 64-bit computers, the type `int` can hold 63-bit signed integers (including the sign, i.e. one bit cannot be used). The `int_of_xxx` functions raise `Cannot_represent` if the number to convert is too big (or too small) to be represented as `int`. Note that this depends on the word size of your architecture.

    val int_of_int4 : int4 -> int

    val int_of_uint4 : uint4 -> int

    val int_of_int8 : int8 -> int

    val int_of_uint8 : uint8 -> int

    val int4_of_int : int -> int4

    val uint4_of_int : int -> uint4

    val int8_of_int : int -> int8

    val uint8_of_int : int -> uint8

    val int32_of_int4 : int4 -> int32

    val int32_of_uint4 : uint4 -> int32

    val int32_of_int8 : int8 -> int32

    val int32_of_uint8 : uint8 -> int32

    val int4_of_int32 : int32 -> int4

    val uint4_of_int32 : int32 -> uint4

    val int8_of_int32 : int32 -> int8

    val uint8_of_int32 : int32 -> uint8

    val int64_of_int4 : int4 -> int64

    val int64_of_uint4 : uint4 -> int64

    val int64_of_int8 : int8 -> int64

    val int64_of_uint8 : uint8 -> int64

    val int4_of_int64 : int64 -> int4

    val uint4_of_int64 : int64 -> uint4

    val int8_of_int64 : int64 -> int8

    val uint8_of_int64 : int64 -> uint8

Casts from `uint4`/`uint8` to `int32`/`int64`. Here, the sign is ignored and simply considered as a bit.

    val logical_uint4_of_int32 : int32 -> uint4

    val logical_int32_of_uint4 : uint4 -> int32

    val logical_uint8_of_int64 : int64 -> uint8

    val logical_int64_of_uint8 : uint8 -> int64

    val fp8_of_fp4 : fp4 -> fp8

    val fp4_of_fp8 : fp8 -> fp4

Note `fp4_of_fp8`: This conversion is not exact. It is quite normal that precision is lost. Numbers too small or too large for fp4 are converted to the "infinity" value.

    val float_of_fp4 : fp4 -> float

    val float_of_fp8 : fp8 -> float

    val fp4_of_float : float -> fp4

    val fp8_of_float : float -> fp8

Note fp4_of_float: The same problems as in fp4_of_fp8 may arise

## Comparisons

The comparisons "=" and "<>" work for all numbers.

For signed integers, the operators "<", "<=", ">", and ">=" work, too. The unsigned integer type use representation that are not compatible with these operators, and the following functions need to be called.

For `fp4` and `fp8` there are no comparison functions - convert to `float` first and compare then.

    val lt_uint4 : uint4 -> uint4 -> bool

`lt_uint4` is true iff the first value is less than the second value as unsigned int

    val le_uint4 : uint4 -> uint4 -> bool

    val gt_uint4 : uint4 -> uint4 -> bool

    val ge_uint4 : uint4 -> uint4 -> bool

Other comparisons

    val lt_uint8 : uint8 -> uint8 -> bool

`lt_uint8` is true iff the first value is less than the second value as unsigned int

    val le_uint8 : uint8 -> uint8 -> bool

    val gt_uint8 : uint8 -> uint8 -> bool

    val ge_uint8 : uint8 -> uint8 -> bool

Other comparisons

## Minimum/maximum values

    val min_int4 : int4

    val min_uint4 : uint4

    val min_int8 : int8

    val min_uint8 : uint8

    val max_int4 : int4

    val max_uint4 : uint4

    val max_int8 : int8

    val max_uint8 : uint8

    module type ENCDEC = sig .. end

    module BE: ENCDEC

Encoders/decoders for big endian - network byte order

    module LE: ENCDEC

Encoders/decoders for little endian

    module HO: ENCDEC

Encoders/decoders for host byte order - which is either little endian or big endian, depending on the CPU (or CPU mode)