Обработка с фиксированной точкой: в чем разница между uint16_t и uint_fast16_t?

У меня есть 16-битный процессор с фиксированной точкой, и я хочу выполнять с ним обработку с фиксированной точкой. Я ищу правильный тип данных для беззнаковых 16-битных целых чисел.

Мой вопрос: в чем разница между uint16_t и uint_fast16_t? (Они включены в stdint.h.) Является ли uint_fast16_t лучше, так как он быстрее??

Спасибо!!


person O_O    schedule 10.02.2011    source источник
comment
en.wikipedia.org/wiki/Stdint.h#Integer_types   -  person kennytm    schedule 10.02.2011


Ответы (2)


uint16_t — это 16-битное целое число без знака. uint_fast16_t — это самое быстрое доступное целое число без знака, состоящее не менее чем из 16 бит.

person Sven    schedule 10.02.2011
comment
Ответ был бы более полезным, если бы вы могли определить быстрее. - person Chris Tonkinson; 10.02.2011
comment
Неважно: стандарт ничего не предписывает об этих типах, за исключением того, что их ширина должна быть больше или равна N. Он также оставляет за разработчиком право решать, что значит быть быстрым целочисленным типом. - person Chris Tonkinson; 10.02.2011
comment
Интересно... мне кажется странным, что для этого типа данных не указан размер... это зависит от пользователя... о_о, так приведет ли выполнение sizeof() к этому типу данных к ошибке? В любом случае, я не думаю, что uint_fast16_t применим ко мне. Я просто буду придерживаться uint16_t как своего типа данных для арифметики с фиксированной точкой. :) Спасибо... - person O_O; 10.02.2011
comment
В 32-разрядной или более поздней системе 16-разрядное целое может быть медленнее, чем 32-разрядное целое из-за способа доступа к адресам памяти. Я нашел это в 32-битной системе, реализующей алгоритм CORDIC с фиксированной точкой; использование int оказалось быстрее, чем short int, даже когда алгоритм обрабатывал только 16 бит. На неопределенном 16-битном процессоре O_O, я полагаю, не было бы никакой разницы между unint16_t и uint_fast16_t, но если бы код был портирован на 32- или 64-битную систему, разница может быть большой. - person oosterwal; 10.02.2011
comment
@O_O Мне кажется странным, что для этого типа данных не указан размер - его размер = 16 бит. это зависит от пользователя - понятия не имею, что вы имеете в виду; это зависит от реализации. так приведет ли выполнение sizeof() к этому типу данных к ошибке? -- Нет, конечно нет; uint_fast16_t — это просто определение типа для uint16_t или uint32_t. В любом случае, я не думаю, что uint_fast16_t применим ко мне. Я просто буду придерживаться uint16_t в качестве своего типа данных для арифметики с фиксированной запятой — это нормально, если вам все равно, будет ли ваша программа быстрой, и вам нужно только использование памяти. - person Jim Balter; 11.02.2011
comment
@ChrisTonkinson Лучше поздно, чем никогда: при использовании, например. тип uint16_t для локальных переменных, таких как счетчики циклов, неявно запрашивает поведение 16-битного переполнения, требуя усечения после каждого вычисления, даже если на самом деле переполнение может никогда не произойти. Поскольку усечение не нужно выполнять/проверять, 32-битная переменная работает быстрее на многих платформах, таких как ARM32. Это просто требует меньше вычислений. - person MrD; 04.09.2020

uint16_t является более строгим, чем uint_fast16_t и uint_least16_t. Мало того, что последние два могут быть шире 16 бит, они также могут иметь биты заполнения (биты, которые не учитывают значение, такие как биты четности).

Эта разница еще более заметна для знаковых типов. Здесь типы точной ширины должны использовать дополнение до двух для представления отрицательных значений.

person Jens Gustedt    schedule 10.02.2011