12.2 Data Types
All 12 of the primary fixed-point types and their aliases, described in Section 4.1 “Overview and principles of the fixed-point data types” of ISO/IEC TR 18037:2008, are supported. Fixed-point data values contain fractional and optional integral parts. The format of fixed-point data in XC32 are as specified in the table below.
In the formats shown, s is the sign bit for a signed type (there is no
            sign bit for an unsigned type). The period character (.) is the
            specifier that separates the integral part and the fractional part. The numeric digits
            represent the number of bits in the integral part or in the fractional part.
| Type | Format | Description | 
|---|---|---|
short _Fract | s0.7 | 1 sign bit, no integer bits, 7 fractional bits | 
unsigned short _Fract | 0.8 | 8 fractional bits only | 
_Fract | s0.15 | 1 sign bit, 15 fractional bits | 
unsigned _Fract | 0.16 | 16 fractional bits only | 
long _Fract | s0.31 | 1 sign bit, no integer bits, 31 fractional bits | 
unsigned long _Fract | 0.32 | 32 fractional bits only | 
long long _Fract | s0.63 | 1 sign bit, no integer bits, 63 fractional bits | 
unsigned long long _Fract | 0.64 | 64 fractional bits only | 
short _Accum | s8.7 | 1 sign bit, 8 integer bits, 7 fractional bits | 
unsigned short _Accum | 8.8 | 8 integer bits, 8 fractional bits | 
_Accum | s16.15 | 1 sign bit, 16 integer bits, 15 fractional bits | 
unsigned _Accum | 16.16 | 16 integer bits, 16 fractional bits | 
long _Accum | s32.31 | 1 sign bit, 32 integer bits, 31 fractional bits | 
unsigned long _Accum | 32.32 | 32 integer bits, 32 fractional bits | 
long long _Accum | s32.31 | 1 sign bit, 32 integer bits, 31 fractional bits | 
unsigned long long _Accum | 32.32 | 32 integer bits, 32 fractional bits | 
The _Sat type modifier may be used with any type in the above table to
            indicate that values are saturated, as described in ISO/IEC TR 18037:2008. For example,
                _Sat short _Fract is the saturating form of short
                _Fract.  Signed types saturate at the most negative and positive numbers
            representable in the corresponding format. Unsigned types saturate at zero and the most
            positive number representable in the format.
stdfix.h, which
            provides various pre-processor macros related to fixed-point support. These include
            those show in the following table.| <stdfix.h> alias | Type | 
|---|---|
fract | _Fract | 
accum | _Accum | 
sat | _Sat | 
  #include <stdfix.h>
  void main () {
    int i;
    fract a[5] = {0.5,0.4,0.2,0.0,-0.1};
    fract b[5] = {0.1,0.8,0.6,0.5,-0.1};
    accum dp = 0;
    /* Calculate dot product of a[] and b[] */
    for (i=0; i<5; i++) {
        dp += a[i] * b[i];
    }
  }The default behavior of overflow on signed or unsigned types is saturation. The pragmas described in Section 4.1.3 "Rounding and Overflow" of ISO/IEC TR 18037:2008 to control the rounding and overflow behavior are not supported.
The following table describes the fixed-point literal suffixes supported to form fixed-point literals of each type.
| Type | Suffixes | 
|---|---|
short _Fract | hr, HR | 
unsigned short
                            _Fract | uhr, UHR | 
_Fract | r, R | 
unsigned
                            _Fract | ur, UR | 
long _Fract | lr, LR | 
unsigned long
                            _Fract | ulr, ULR | 
long long
                            _Fract | llr, LLR | 
unsigned long long
                                _Fract | ullr, ULLR | 
short _Accum | hk, HK | 
unsigned short
                            _Accum | uhk, UHK | 
_Accum | k, K | 
unsigned
                            _Accum | uk, UK | 
long _Accum | lk, LK | 
unsigned long
                            _Accum | ulk, ULK | 
long long
                            _Accum | llk, LLK | 
unsigned long long
                                _Accum | ullk, ULLK | 
