Знаки битовых полей

Рейтинг: 0Ответов: 2Опубликовано: 16.04.2011

Имеют ли значения знаки битовых полей? Нужно ли как-то учитывать знаки полей или можно их игнорировать?

struct {
  signed   X :1;
  unsigned Y :1;
} p;

Будут ли в структуре выше различия между X и Y?

Ответы

▲ 2
#include <iostream>

struct C {
  signed   X :1;
  unsigned Y :1;
};

int main() {
    C c = {0};
    ++c.X;
    std::cout << c.X << std::endl;
    return 0;
}

Похоже влияет, т.к. программа выводит -1 (компилятор gcc). В принципе это логично, ибо однобитное знаковое число в дополнительном коде может иметь только 2 значения - 0 и -1.

▲ 2

@Алексей Сонькин, Вы правы, g++ под Linux пофигу на биты, точнее не совсем. Если пытаться взять sizeof(p.X); то компилятор догадывается о том, что поле битовое, но при этом:

struct P {
    signed   X :1;
    unsigned Y :1;
};

int main(void) {

    P p = {0};

    (--p.X)--;
    (--p.Y)--;

    std::cout << "Y: " << p.Y << "; X:" << p.X << std::endl;

    return 0;
}

Дает в ответе: Y: 4294967294; X:-2.

А вот этот вариант:

(++p.X)++;
(++p.Y)++;

Дает: Y: 2; X:2

Может я чего-то не понимаю?