6.1.7 Типы с фиксированной точкой
В качестве расширения GNU C поддерживает типы с фиксированной точкой, определённые в проекте N1169 документа ISO/IEC DTR 18037. Поддержка типов с фиксированной точкой в GCC будет развиваться по мере изменения проекта технического отчёта. Соглашения о вызовах для любой целевой платформы также могут измениться. Не все целевые платформы поддерживают типы с фиксированной точкой.
Типы с фиксированной точкой: 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.
Значения данных с фиксированной точкой содержат дробную и необязательную целую часть. Формат данных с фиксированной точкой различается и зависит от целевой машины.
Поддержка типов с фиксированной точкой включает:
- операторы инкремента и декремента с префиксной и постфиксной формами (
++,--) - унарные арифметические операторы (
+,-,!) - бинарные арифметические операторы (
+,-,*,/) - бинарные операторы сдвига (
<<,>>) - операторы сравнения (
<,<=,>=,>) - операторы равенства (
==,!=) - операторы присваивания (
+=,-=,*=,/=,<<=,>>=) - преобразования в целочисленные типы, типы с плавающей точкой и типы с фиксированной точкой и из них
Используйте суффикс в литеральной константе с фиксированной точкой:
- ‘hr’ или ‘HR’ для
short _Fractи_Sat short _Fract - ‘r’ или ‘R’ для
_Fractи_Sat _Fract - ‘lr’ или ‘LR’ для
long _Fractи_Sat long _Fract - ‘llr’ или ‘LLR’ для
long long _Fractи_Sat long long _Fract - ‘uhr’ или ‘UHR’ для
unsigned short _Fractи_Sat unsigned short _Fract - ‘ur’ или ‘UR’ для
unsigned _Fractи_Sat unsigned _Fract - ‘ulr’ или ‘ULR’ для
unsigned long _Fractи_Sat unsigned long _Fract - ‘ullr’ или ‘ULLR’ для
unsigned long long _Fractи_Sat unsigned long long _Fract - ‘hk’ или ‘HK’ для
short _Accumи_Sat short _Accum - ‘k’ или ‘K’ для
_Accumи_Sat _Accum - ‘lk’ или ‘LK’ для
long _Accumи_Sat long _Accum - ‘llk’ или ‘LLK’ для
long long _Accumи_Sat long long _Accum - ‘uhk’ или ‘UHK’ для
unsigned short _Accumи_Sat unsigned short _Accum - ‘uk’ или ‘UK’ для
unsigned _Accumи_Sat unsigned _Accum - ‘ulk’ или ‘ULK’ для
unsigned long _Accumи_Sat unsigned long _Accum - ‘ullk’ или ‘ULLK’ для
unsigned long long _Accumи_Sat unsigned long long _Accum
Поддержка типов с фиксированной точкой в GCC, предусмотренная проектом технического отчёта, реализована не полностью:
- Директивы pragma для управления переполнением и округлением не реализованы.
Типы с фиксированной точкой поддерживаются форматом отладочной информации DWARF.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Fixed_002dPoint.html