ANSI C поддержка, подписанная / неподписанные битовые поля?

14
задан Anto Jurković 2 March 2015 в 10:28
поделиться

8 ответов

Да. Пример от здесь :

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;

Только Вы знаете, имеет ли это смысл в Ваших проектах; обычно, это делает для полей больше чем с одним битом, если поле может значительно быть отрицательным.

8
ответ дан 1 December 2019 в 08:54
поделиться

Соответствующая часть стандарта (ISO/IEC 9899:1999) является 6.7.2.1 # 4:

битовое поле А должно иметь тип, который является квалифицированной или неполной версией _Bool, подписанного интервала, неподписанного интервала или некоторого другого определенного реализацией типа.

14
ответ дан 1 December 2019 в 08:54
поделиться

Я не думаю, что Andrew говорит об одноразрядных битовых полях. Например, 4-разрядные поля: 3 бита числовой информации, один бит для знака. Это может полностью иметь смысл, хотя я признаюсь, что не был способен придумывать такой сценарий первое, что пришло на ум.

Обновление: я не говорю, что не могу думать об использовании для многоразрядных битовых полей (использовавших их все время назад в модемные дни на 2400 бит/с для сжатия данных как можно больше для передачи), но я не могу думать об использовании для битовых полей со знаком, особенно не странное, очевидное, которое было бы "ага" момент для читателей.

2
ответ дан 1 December 2019 в 08:54
поделиться

Очень важно квалифицировать Ваши переменные, как подписано или неподписанный. Компилятор должен знать, как рассматривать Ваши переменные во время сравнений и кастинга. Исследуйте вывод этого кода:

#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.

7
ответ дан 1 December 2019 в 08:54
поделиться

Да, это может. C битовые поля по существу просто целые числа ограниченного диапазона. Часто аппаратные интерфейсы упаковывают биты вместе в таком далеко, что некоторое управление может пойти от, скажем,-8 к 7, в этом случае Вы действительно хотите битовое поле со знаком, или от 0 до 15, в этом случае Вы хотите неподписанное битовое поле.

1
ответ дан 1 December 2019 в 08:54
поделиться
0
ответ дан 1 December 2019 в 08:54
поделиться

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

-4
ответ дан 1 December 2019 в 08:54
поделиться

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

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

0
ответ дан 1 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

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