Поддерживает ли 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-битного "длинного длинного" через битовые поля... сгенерированный код будет таким же как если бы я делал все маскирование, подписывание и т.д. явно, но он читал бы намного лучше...

Ответ 9

Бит-маскировка подписанных типов варьируется от аппаратного обеспечения платформы до аппаратного обеспечения платформы из-за того, как она может иметь дело с переполнением из смены и т.д.

Любая половина хорошего инструмента QA будет предупреждать о таком использовании.

Ответ 10

если "бит" подписан, тогда у вас есть диапазон -1, 0, 1, который затем становится тройной цифрой. Я не думаю, что стандартная аббревиатура для этого будет подходящей здесь, но делает интересные разговоры:)