В чем разница между типами int int8_t
, int_least8_t
и int_fast8_t
?
Разница в int8_t, int_least8_t и int_fast8_t?
Ответ 1
Разница определяется в разделах стандарта C99, которые цитирует Карл Норум. Но может быть полезно иметь пример.
Предположим, у вас есть компилятор C для 36-разрядной системы, char
= 9 бит, short
= 18 бит, int
= 36 бит и long
= 72 бит. Тогда
-
int8_t
не существует, потому что нет возможности удовлетворить ограничение наличия ровно 8 битов значения без отступов. -
int_least8_t
- это typedefchar
. NOTshort
илиint
, потому что стандарт требует наименьшего типа с не менее 8 бит. -
int_fast8_t
может быть любым. Вероятно, это будет typedefint
, если "родной" размер считается "быстрым".
Ответ 2
В разделе spec 7.8.1.1 Целые значения точной ширины, пункт 1:
Имя typedef
int
N_t
обозначает знаковый целочисленный тип с шириной N, без битов дополнений и двухкомпонентное представление. Таким образом,int8_t
обозначает знаковый целочисленный тип с шириной ровно 8 бит.
И из: 7.18.1.2 Целочисленные типы минимальной ширины, пункт 1:
Имя typedef
int_least
N_t
обозначает знаковый целочисленный тип с шириной не менее N, так что ни один целочисленный тип со знаком меньшего размера не имеет по крайней мере, указанной ширины. Таким образом,int_least32_t
обозначает знаковый целочисленный тип с шириной не менее 32 бит.
И, наконец, из 7.18.1.3 Самые быстрые целые числа минимальной ширины, параграф 2:
Имя typedef
int_fast
N_t
обозначает наивысший тип целочисленного знака с шириной не менее N. Имя typedefuint_fast
N_t
обозначает самый быстрый целочисленный тип без знака с шириной не менее N.
Ответ 3
intN_t
(и uintN_t
) не требуется во всех реализациях C99. Эти типы являются "целыми типами точной ширины". Они требуются в реализациях, где имеет смысл иметь их (в основном каждый настольный компьютер).
int_leastN_t
требуется во всех реализациях C99 для значений N из 8, 16, 32 и 64. Это "целые типы минимальной ширины".
int_fastN_t
требуется во всей реализации C99 для значений N из 8, 16, 32 и 64. Это "самые быстрые целые типы минимальной ширины".
Ответ 4
Вот концептуально простой ответ: ширина int * N_t для всех трех типов должна быть >= N. intN_t имеет точно N бит, int_leastN_t - наименьшее ( самый узкий) такой тип, а int_fastN_t является самым быстрым таким типом.
Например, на машине с 8-битными байтами и 32-разрядными быстрыми регистрами int8_t и int_least8_t сглажены с подписью char, но int_fast8_t сглаживается до int32_t. Принимая во внимание, что если реализация решила их определить, int_least24_t и int_fast24_t оба будут сглажены с int32_t, а int24_t останется undefined.
Изменить: как указывает Technophile ниже, реальной проблемой для быстрых типов является память, а не регистры (как правило, операции с младшими разрядами регистров могут выполняться так же быстро, как и на всем регистре). Например, для записи в int8_t в памяти может потребоваться загрузка 32-битного слова, содержащего его, изменение только байта, а затем запись его обратно, тогда как если бы он был сохранен в 32-словом, он мог бы быть записан без чтения.
Ответ 5
Они связаны с размером целого и являются только тем, что они кажутся.
int8_t is exactly 8 bits
int_least8_t is the smallest int type that has at least 8 bits
int_fast8_t is the fastest int type that has at least 8 bits.