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 |
