Fixed-Point - Using the GNU Compiler Collection (GCC)

Next: Zero Length, Previous: Hex Floats, Up: C Extensions

### 5.13 Fixed-Point Types

As an extension, the GNU C compiler supports fixed-point types as defined in the N1169 draft of ISO/IEC DTR 18037. Support for fixed-point types in GCC will evolve as the draft technical report changes. Calling conventions for any target might also change. Not all targets support fixed-point types.

The fixed-point types are `short _Fract`, `_Fract`, `long _Fract`, `long long _Fract`, `unsigned short _Fract`, `unsigned _Fract`, `unsigned long _Fract`, `unsigned long long _Fract`, `_Sat short _Fract`, `_Sat _Fract`, `_Sat long _Fract`, `_Sat long long _Fract`, `_Sat unsigned short _Fract`, `_Sat unsigned _Fract`, `_Sat unsigned long _Fract`, `_Sat unsigned long long _Fract`, `short _Accum`, `_Accum`, `long _Accum`, `long long _Accum`, `unsigned short _Accum`, `unsigned _Accum`, `unsigned long _Accum`, `unsigned long long _Accum`, `_Sat short _Accum`, `_Sat _Accum`, `_Sat long _Accum`, `_Sat long long _Accum`, `_Sat unsigned short _Accum`, `_Sat unsigned _Accum`, `_Sat unsigned long _Accum`, `_Sat unsigned long long _Accum`. Fixed-point data values contain fractional and optional integral parts. The format of fixed-point data varies and depends on the target machine.

Support for fixed-point types includes prefix and postfix increment and decrement operators (`++`, `--`); unary arithmetic operators (`+`, `-`, `!`); binary arithmetic operators (`+`, `-`, `*`, `/`); binary shift operators (`<<`, `>>`); relational operators (`<`, `<=`, `>=`, `>`); equality operators (`==`, `!=`); assignment operators (`+=`, `-=`, `*=`, `/=`, `<<=`, `>>=`); and conversions to and from integer, floating-point, or fixed-point types.

Use a suffix ``hr`' or ``HR`' in a literal constant of type `short _Fract` and `_Sat short _Fract`, ``r`' or ``R`' for `_Fract` and `_Sat _Fract`, ``lr`' or ``LR`' for `long _Fract` and `_Sat long _Fract`, ``llr`' or ``LLR`' for `long long _Fract` and `_Sat long long _Fract`, ``uhr`' or ``UHR`' for `unsigned short _Fract` and `_Sat unsigned short _Fract`, ``ur`' or ``UR`' for `unsigned _Fract` and `_Sat unsigned _Fract`, ``ulr`' or ``ULR`' for `unsigned long _Fract` and `_Sat unsigned long _Fract`, ``ullr`' or ``ULLR`' for `unsigned long long _Fract` and `_Sat unsigned long long _Fract`, ``hk`' or ``HK`' for `short _Accum` and `_Sat short _Accum`, ``k`' or ``K`' for `_Accum` and `_Sat _Accum`, ``lk`' or ``LK`' for `long _Accum` and `_Sat long _Accum`, ``llk`' or ``LLK`' for `long long _Accum` and `_Sat long long _Accum`, ``uhk`' or ``UHK`' for `unsigned short _Accum` and `_Sat unsigned short _Accum`, ``uk`' or ``UK`' for `unsigned _Accum` and `_Sat unsigned _Accum`, ``ulk`' or ``ULK`' for `unsigned long _Accum` and `_Sat unsigned long _Accum`, and ``ullk`' or ``ULLK`' for `unsigned long long _Accum` and `_Sat unsigned long long _Accum`.

GCC support of fixed-point types as specified by the draft technical report is incomplete:

- Pragmas to control overflow and rounding behaviors are not implemented.

Fixed-point types are supported by the DWARF2 debug information format.