Почему достаточно? (хранение int в массиве char)

В одном из ответов (и его комментариев) на Как преобразовать int в строку в C дано следующее решение

char str[ENOUGH];
sprintf(str, "%d", 42);

в комментариях caf упоминается, что ENOUGH можно определить во время компиляции с помощью:

#define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)

Я получаю + 2 потому что вы должны иметь возможность отображать знак минус и нулевой терминатор, но какова логика позади другой части? конкретно CHAR_BIT?

3 ответа

Если int тип 32-битный, сколько байтов нужно для представления любого числа (без знака и нулевого терминатора)?

Если int тип 32-битный максимальный int значение 2147483648 (предполагая два дополнения), то есть 10 цифры так 10 байты, необходимые для хранения.

Чтобы узнать количество бит в int в конкретной платформе (например, 32 в нашем примере) мы можем использовать CHAR_BIT * sizeof (int) == 32, Помните CHAR_BIT количество битов в байте C и sizeof дает размер в байтах.

затем (32 - 1) / 3 == 10 так 10 байты нужны. Вы также можете спросить, как автор находит значение 3? Хорошо log база 2 из 10 немного больше, чем 3,

Я предполагаю, что ENOUGH вычисляется консервативным способом, потому что последний +2 учитывает нулевой терминатор \0 (всегда присутствует, это нормально) и знак минуса (- иногда присутствует). Для положительных значений (и нуля) вы получите один неиспользованный дополнительный байт.

Итак, если ENOUGH НЕ рассчитывается как строго минимальное количество байтов, необходимое для хранения значения, почему бы не использовать фиксированное значение 12? (10 байтов для числа и 2 байта для \0 и знака)

Тем не мение:

CHAR_BIT * sizeof (int) - это точное количество бит для хранения int на вашем компьютере.

-1 потому, что для знака используется 1 бит (вы "потребляете" 1 бит информации для хранения знака, независимо от применяемой техники, пусть это будет дополнение двух, дополнение одного или наивное хранение знака)

/ 3 потому, что каждая 1 десятичная цифра занимает не менее 3 бит информации

CHAR_BIT это количество бит в char (скорее всего 8), sizeof(int) 2 или 4, так ENOUGH равно 7 или 12, что достаточно для сохранения целого числа, включая знак и терминатор NULL.

Другие вопросы по тегам