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 () для битовых полей, что является самым эффективным способом вычислить его - во времени выполнения! Предположите, что у Вас есть циклы, которые зависят от этого, и Вы не хотите, чтобы они повредились, при изменении размера битового поля - и никакой справедливый обман и создание размера битового поля и длины цикла макрос.;-)
Вы не можете определить размер битовых полей в C. Однако вы можете узнать размер в битах других типов, используя значение CHAR_BIT
, найденное в limits.h. Размер в битах - это просто CHAR_BIT
* sizeof (type).
Не думайте, что байт в Си - это октет, он как минимум 8 бит. Существуют реальные машины с 16 или даже 32-битными байтами.
По поводу вашей правки:
Я бы сказал, что битовое поле int a: n;
имеет размер n бит по определению. Дополнительные биты прокладки при помещении в struct принадлежат struct, а не битовому полю.
Мой совет: Не используйте битовые поля, а используйте (массивы) unsigned char
и работайте с битмасками. Таким образом, многое в поведении (переполнение, отсутствие набивки) будет четко определено.
Невозможно найти размер битового поля с помощью 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
подробнее.