Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как получить размерность int в байтах ? Без использования sizeof

#c


Это каким-то образом связано с переполнением?
    


Ответы

Ответ 1



Для беззнаковых сработает такой вариант unsigned int a = (unsigned int)-1; unsigned int bits = 1; while (a >>= 1) bits++; unsigned int bytes = bits / 8; Впрочем, количество бит в байте не оговорено стандартом.

Ответ 2



Кроссплатформенный вариант подсчета для беззнаковых типов: unsigned int a = ~(0U); unsigned char count = 0; do { count++; } while (a >>= 1); count /= CHAR_BIT; Вместо ~(0U) можно использовать UINT_MAX, представленный вместе с CHAR_BIT в заголовочном файле limits.h.

Ответ 3



Простой способ: #include #include size_t bits = 0; int x = INT_MAX; while (x) { ++bits; x = x / 2; } size_t bytes = (bits + 1) / CHAR_BIT; Однако, вообще говоря, стандарт языка допускает, что в представлении целочисленных типов могут присутствовать padding bits, которые не участвуют в формировании значения типа, а значит не будут подсчитаны приведённым выше способом. Альтернативный способ, основанный на арифметике указателей, и для которого не существенно наличие padding bits: int x = 0; int *begin, *end; begin = &x; end = begin + 1; ptrdiff_t bytes = (unsigned char *)end - (unsigned char *)begin;

Ответ 4



Можно ещё так (это ведь гипотетический вопрос, да?): #include #include // через логарифм: lround(log2(UINT_MAX) / CHAR_BIT); // посредством подсчёта количества бит: __builtin_popcount(UINT_MAX) / CHAR_BIT;

Комментариев нет:

Отправить комментарий