#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;
Комментариев нет:
Отправить комментарий