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.