структура двойной выход - PullRequest
2 голосов
/ 24 декабря 2011
struct node
{
    double a : 23;
    int b;
}s;
int main()
{    
    printf("%d\n",sizeof(s));
}

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

Ответы [ 4 ]

5 голосов
/ 24 декабря 2011

Мой ответ для C. Я понятия не имею, относится ли он к C ++.
Я предлагаю вам не пытаться писать многоязычные исходные файлы. Это тяжелая работа.

  • Нет прототипа в объеме для printf
  • тип sizeof(s) и тип, требуемый "%d", не совпадают
  • отсутствует return 0; в основном (для C89)

Какую ошибку компилятора вы получаете?


Я хочу знать, что мы не можем делать поразрядно с двойным типом данных

Потому что Стандарт C99 так говорит, например (акцент мой)

6.7.2.1 / 9

Битовое поле интерпретируется как целочисленный тип со знаком или без знака , состоящий из указанного количество бит.

4 голосов
/ 24 декабря 2011

C предоставляет специальный тип элемента структуры, известный как битовое поле, которое представляет собой целое число с явно указанным числом битов.

Нецелые типы нельзя использовать в качестве базовых типов для битовых полей.

3 голосов
/ 24 декабря 2011

Цитируется из вики:

C также предоставляет специальный тип элемента структуры, известный как битовое поле, которое является целым числом с явно указанным числом битов. Битовое поле объявляется как структурный член типа int, подписанный int, unsigned int или _Bool, после имени элемента стоит двоеточие (:) и количество битов, которое оно должно занимать. Общее количество битов в одном битовом поле не должно превышать общее количество битов в объявленном типе.

в операторе double a : 23; вы используете битовое поле для double, что является ошибкой. Вместо этого следует использовать int.

Edit: Поведение зависит от реализации и использует что-либо, кроме этих. Char может работать в вашей системе, но может не работать на другой платформе, поскольку не является частью стандарта.

2 голосов
/ 24 декабря 2011

Да, вы не можете применять битовые поля для двойного, поэтому он дает ошибку компиляции. Битовые поля разрешены только для типов данных со знаком и без знака, _bool.

...