Существует ли разрядно-эквивалентный из sizeof () в C?

Sizeof () не работает при применении к битовым полям:

# cat p.c
  #include<stdio.h>
  int main( int argc, char **argv )
  {
    struct { unsigned int bitfield : 3; } s;
    fprintf( stdout, "size=%d\n", sizeof(s.bitfield) );
  }
# gcc p.c -o p
  p.c: In function ‘main’:
  p.c:5: error: ‘sizeof’ applied to a bit-field

... очевидно, так как это не может возвратить частичный размер с плавающей точкой или что-то. Однако это подняло интересный вопрос. Существует ли эквивалент в C, который скажет Вам число битов в переменной/типе? Идеально, это также работало бы на регулярные типы также, как символ и интервал, в дополнение к битовым полям.

Обновление:

Если нет никакого языка, эквивалентного из sizeof () для битовых полей, что является самым эффективным способом вычислить его - во времени выполнения! Предположите, что у Вас есть циклы, которые зависят от этого, и Вы не хотите, чтобы они повредились, при изменении размера битового поля - и никакой справедливый обман и создание размера битового поля и длины цикла макрос.;-)

25
задан eruciform 23 July 2010 в 16:28
поделиться

2 ответа

Вы не можете определить размер битовых полей в C. Однако вы можете узнать размер в битах других типов, используя значение CHAR_BIT, найденное в limits.h. Размер в битах - это просто CHAR_BIT * sizeof (type).

Не думайте, что байт в Си - это октет, он как минимум 8 бит. Существуют реальные машины с 16 или даже 32-битными байтами.

По поводу вашей правки: Я бы сказал, что битовое поле int a: n; имеет размер n бит по определению. Дополнительные биты прокладки при помещении в struct принадлежат struct, а не битовому полю.

Мой совет: Не используйте битовые поля, а используйте (массивы) unsigned char и работайте с битмасками. Таким образом, многое в поведении (переполнение, отсутствие набивки) будет четко определено.

18
ответ дан 28 November 2019 в 21:52
поделиться

Невозможно найти размер битового поля с помощью sizeof(). Обратитесь к C99:

  • 6.5.3.4 The sizeof operator, bit-field явно не поддерживается sizeof()
  • 6.7.2.1 Structure and union specifiers здесь уточняется, что bit-field не является самостоятельным членом.

В противном случае можно попытаться присвоить члену bit-field значение -1u (значение со всеми установленными битами), а затем найти индекс старшего бита. Например (не проверено):

s.bitfield = -1u;
num_bits = ffs(s.bitfield+1)-1;

man ffs подробнее.

4
ответ дан 28 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: