Поддерживает ли ANSI C подписанные/неподписанные битовые поля?
Имеет ли смысл квалифицировать поля бит как подписанные/неподписанные?
Ответы
Ответ 1
Соответствующая часть стандарта (ISO/IEC 9899: 1999) - это 6.7.2.1 # 4:
Поле бит должно иметь тип, который является квалифицированным или неквалифицированным версия _Bool, подписанный int, unsigned int или некоторые другие определенные для реализации тип.
Ответ 2
Да. Пример из здесь:
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 complement!
*/
signed field2 :1;
/* align next field on a storage unit */
unsigned :0;
unsigned field3 :6;
}full_of_fields;
Только вы знаете, имеет ли это смысл в ваших проектах; как правило, он используется для полей с более чем одним битом, если поле может иметь смысл отрицательно.
Ответ 3
Очень важно квалифицировать ваши переменные как подписанные или неподписанные. Компилятор должен знать, как обрабатывать ваши переменные во время сравнений и кастинга. Изучите вывод этого кода:
#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.
Ответ 4
Я не думаю, что Андрей говорит о однобитовых битовых полях. Например, 4-битные поля: 3 бит числовой информации, один бит для знака. Это может иметь смысл, хотя я признаю, что не могу придумать такой сценарий с моей головы.
Обновление: я не говорю, что я не могу придумать, как использовать многобитовые битовые поля (используя их все время в 2400 бит/с в модемных днях для сжатия данных, насколько это возможно для передачи), но я могу "Я думаю, что использование для полей бит бит, особенно не странное, очевидное, которое было бы" ага "для читателей.
Ответ 5
Скорее всего, ANSI-C предоставляет подписанные и неподписанные битовые поля. Требуется. Это также является частью написания наложений отладчика для типов с плавающей точкой IEEE-754 [[1] [5] [10]], [[1] [8] [23]] и [[1] [10] [53] ]. Это полезно в машинных типах или сетевых переводах таких данных или при проверке двойных преобразований (64 бит для математики) на половину точности (16 бит для сжатия) перед отправкой по ссылке, например, текстуры видеокарты.
// Fields need to be reordered based on machine/compiler endian orientation
typedef union _DebugFloat {
float f;
unsigned long u;
struct _Fields {
signed s : 1;
unsigned e : 8;
unsigned m : 23;
} fields;
} DebugFloat;
Эрик
Ответ 6
Да, это возможно. С-бит-поля по существу являются целыми числами ограниченного диапазона. Часто аппаратные интерфейсы объединяют биты вместе, так что некоторые элементы управления могут идти от, скажем, от -8 до 7, и в этом случае вы хотите иметь подписанное битовое поле или от 0 до 15, и в этом случае вы хотите, поле.
Ответ 7
Одно место, где знаковые битовые поля полезны, - это эмуляция, в которой эмулированная машина имеет меньше бит, чем ваше слово по умолчанию.
В настоящее время я просматриваю эмуляцию 48-битной машины и пытаюсь разобраться, если разумно использовать 48 бит из 64-битного "длинного длинного" через битовые поля... сгенерированный код будет таким же как если бы я делал все маскирование, подписывание и т.д. явно, но он читал бы намного лучше...
Ответ 8
Согласно этой ссылке, можно:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm
Ответ 9
Бит-маскировка подписанных типов варьируется от аппаратного обеспечения платформы до аппаратного обеспечения платформы из-за того, как она может иметь дело с переполнением из смены и т.д.
Любая половина хорошего инструмента QA будет предупреждать о таком использовании.
Ответ 10
если "бит" подписан, тогда у вас есть диапазон -1, 0, 1, который затем становится тройной цифрой. Я не думаю, что стандартная аббревиатура для этого будет подходящей здесь, но делает интересные разговоры:)