Разница между int8_t, int_least8_t и int_fast8_t? - PullRequest
56 голосов
/ 10 марта 2011

В чем разница между типами int int8_t, int_least8_t и int_fast8_t?

Ответы [ 5 ]

63 голосов
/ 10 марта 2011

Разница определена в разделах стандарта C99, которые цитирует Карл Норум.Но может быть полезно иметь пример.

Предположим, у вас есть компилятор C для 36-битной системы, с char = 9 бит, short = 18 бит, int = 36 бити long = 72 бита.Тогда

  • int8_t не существует , потому что нет способа удовлетворить ограничение на наличие точно 8 битов значения без заполнения.
  • int_least8_t - это typedef, равный char.НЕ имеет значения short или int, поскольку стандарт требует наименьший тип с как минимум 8 битами.
  • int_fast8_t может быть любым.Вероятно, это будет typedef, равный int, если «собственный» размер считается «быстрым».
57 голосов
/ 10 марта 2011

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

15 голосов
/ 10 марта 2011

intN_tuintN_t) - не требуется во всех реализациях C99 .Эти типы являются «целочисленными типами точной ширины».Они требуются в реализациях, где имеет смысл иметь их (в основном на каждом настольном компьютере).

int_leastN_t требуется во всех реализациях C99 для значений N, равных 8, 16, 32 и 64. Это"целочисленные типы минимальной ширины".

int_fastN_t требуется во всех реализациях C99 для значений N из 8, 16, 32 и 64. Это "самые быстрые целочисленные типы минимальной ширины".

10 голосов
/ 10 марта 2011

Вот концептуально простой ответ: ширина 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 оставлено неопределенным.

Редактировать: как указывает Технофил ниже, реальная проблема для быстрых типов - это память, а не регистры (как правило, операции над младшими битами регистров могут выполняться так же быстро, как и над всем регистром).Например, запись в int8_t в памяти может потребовать загрузки 32-разрядного слова, содержащего его, изменения только байта, а затем его обратной записи, тогда как если бы он был сохранен в 32-значном слове, он мог бы быть записан без чтения.

0 голосов
/ 10 марта 2011

Они связаны с размером целого числа и являются именно тем, как они звучат.

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...