Да. Пример от здесь :
struct {
/* field 4 bits wide */
unsigned field1 :4;
/*
* unnamed 3 bit field
* unnamed fields allow for padding
*/
unsigned :3;
/*
* one-bit field
* can only be 0 or -1 in two's complement!
*/
signed field2 :1;
/* align next field on a storage unit */
unsigned :0;
unsigned field3 :6;
}full_of_fields;
Только Вы знаете, имеет ли это смысл в Ваших проектах; обычно, это делает для полей больше чем с одним битом, если поле может значительно быть отрицательным.
Соответствующая часть стандарта (ISO/IEC 9899:1999) является 6.7.2.1 # 4:
битовое поле А должно иметь тип, который является квалифицированной или неполной версией _Bool, подписанного интервала, неподписанного интервала или некоторого другого определенного реализацией типа.
Я не думаю, что Andrew говорит об одноразрядных битовых полях. Например, 4-разрядные поля: 3 бита числовой информации, один бит для знака. Это может полностью иметь смысл, хотя я признаюсь, что не был способен придумывать такой сценарий первое, что пришло на ум.
Обновление: я не говорю, что не могу думать об использовании для многоразрядных битовых полей (использовавших их все время назад в модемные дни на 2400 бит/с для сжатия данных как можно больше для передачи), но я не могу думать об использовании для битовых полей со знаком, особенно не странное, очевидное, которое было бы "ага" момент для читателей.
Очень важно квалифицировать Ваши переменные, как подписано или неподписанный. Компилятор должен знать, как рассматривать Ваши переменные во время сравнений и кастинга. Исследуйте вывод этого кода:
#include <stdio.h>
typedef struct
{
signed s : 1;
unsigned u : 1;
} BitStruct;
int main(void)
{
BitStruct x;
x.s = 1;
x.u = 1;
printf("s: %d \t u: %d\r\n", x.s, x.u);
printf("s>0: %d \t u>0: %d\r\n", x.s > 0, x.u > 0);
return 0;
}
Вывод:
s: -1 u: 1
s>0: 0 u>0: 1
Компилятор хранит переменную с помощью единственного бита, 1 или 0. Для переменных со знаком старший значащий бит определяет знак (высоко рассматривается отрицательный). Таким образом, переменная со знаком, в то время как это хранится как 1 в двоичном файле, это интерпретируется как отрицательное.
Подробно останавливаясь на этой теме, неподписанное двухбитовое число имеет диапазон от 0 до 3, в то время как двухбитовое число со знаком имеет диапазон-2 к 1.
Да, это может. C битовые поля по существу просто целые числа ограниченного диапазона. Часто аппаратные интерфейсы упаковывают биты вместе в таком далеко, что некоторое управление может пойти от, скажем,-8 к 7, в этом случае Вы действительно хотите битовое поле со знаком, или от 0 до 15, в этом случае Вы хотите неподписанное битовое поле.
Согласно этой ссылке, это возможно:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm
если 'бит' подписывается, то у Вас есть диапазон-1, 0, 1, который тогда становится троичной цифрой. Я не думаю, что стандартное сокращение для этого подошло бы здесь, но делает для интересных переговоров:)
Типы подписанных битовых масок различаются от аппаратного обеспечения платформы к аппаратному обеспечению платформы из-за того, как оно может справляться с переполнением при смене и т. Д.
Любой наполовину хороший инструмент контроля качества сознательно предупредит о таком использовании.