Целочисленные типы с определенной шириной - PullRequest
0 голосов
/ 18 мая 2018

Я читаю C в Nuttshell наткнулся на тему Целочисленные типы с точной шириной (C99) enter image description here

Можеткто-нибудь, пожалуйста, объясните мне, как используются эти типы данных

Где я могу использовать эти типы данных в коде

Почему были введены эти типы данных

IЯ новичок в программировании на С

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

C теперь довольно старый язык (с начала 1970-х), и совместимость всегда была проблемой.В те старые времена размер целых чисел мог отличаться на разных архитектурах.В результате sizeof(int) все еще является деталью реализации.Что требуется по стандарту:

  • char - это наименьшая единица памяти и имеет не менее 8 бит - все другие типы имеют размер, кратный размеру char
  • short имеет по меньшей мере 16 бит
  • int по меньшей мере равен short и имеет по меньшей мере 16 бит
  • long по меньшей мере равноint и имеет как минимум 32 бита
  • long long по меньшей мере равен long и имеет как минимум 64 бита

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

По причинам переносимости язык C не делает предположений на базовом компьютере, именно по этой причине типы с точная ширина не обязательна.При этом они присутствуют на всех распространенных архитектурах.


Ссылки: Черновики n1256 для C99 и n1570 для C11 дают минимальные размеры, которые реализация может заменить большими значениями в 5.2.4.2.1 Размерыцелочисленные типы

Значения, приведенные ниже, должны быть заменены константными выражениями, подходящими для использования в директивах предварительной обработки #if.Кроме того, за исключением CHAR_BIT и MB_LEN_MAX, следующее должно быть заменено выражениями того же типа, что и выражение, являющееся объектом соответствующего типа, преобразованным в соответствии с целочисленными повышениями.Их определяемые реализацией значения должны быть равны или больше по величине (абсолютное значение) показанным с тем же знаком.

  • количество бит для наименьшего объекта, который не является битовым полем (байтом)CHAR_BIT 8

...

  • максимальное значение для объекта типа unsigned short intUSHRT_MAX 65535 // 2 16 - 1

...

  • максимальное значение для объекта типа unsigned intUINT_MAX 65535 // 2 16 - 1

...

  • максимальное значение для объекта типа unsigned long intULONG_MAX 4294967295 // 2 32 - 1

...

  • максимальное значение для объекта типа unsigned long long intULLONG_MAX 18446744073709551615 // 2 64 - 1
0 голосов
/ 18 мая 2018

Переменная может иметь разный размер в зависимости от аппаратного обеспечения.

На микроконтроллерах и более старых процессорах использовались 8-битные и 16-битные архитектуры (в настоящее время распространенный ПК имеет более или менее 64-битную архитектуру, а стандартом было 32-битное несколькомного лет назад).Они имеют «меньшие» переменные, чем те, которые кто-то ожидал бы получить от Java или современного ПК.

Например, int может быть только 16-битным.Это может привести к проблемам, если код переносится из системы, которая ожидает, что он будет 32-разрядным, поскольку это может привести к переполнению целого числа.

Для исправления были объявлены новые типы, которые имеют независимую от системы реализацию.

int32_t всегда 32 бит.Внутренне он может отображаться (например) int или long int в зависимости от деталей реализации.

С этими типами программист может быть уверен, что он всегда получает переменную, достаточно большую для операции.

...