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

Имам 16-битов процесор с фиксирана точка и искам да направя обработка с фиксирана точка с него. Търся правилния тип данни, който да използвам за неподписани 16-битови int..

Въпросът ми е: каква е разликата между 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
Интересно... прави ми впечатление, че този тип данни няма определен размер.. зависи от потребителя.. o_o така че правенето на 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 е просто typedef за 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