Разница в int8_t, int_least8_t и int_fast8_t?

В чем разница между типами int 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 - это typedef char. NOT short или int, потому что стандарт требует наименьшего типа с не менее 8 бит.
  • int_fast8_t может быть любым. Вероятно, это будет typedef int, если "родной" размер считается "быстрым".

Ответ 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. Имя typedef uint_fast N _t обозначает самый быстрый целочисленный тип без знака с шириной не менее N.

Ответ 3

intN_tuintN_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.