Присвоение значения битовому полю длиной 1

Предположим, у меня есть

struct A
{
signed char a:1;
unsigned char b:1;
};

Если у меня есть

A two, three;
two.a = 2; two.b = 2;
three.a = 3; three.b = 3;

two будет содержать 0в своих областях, в то время как three будет содержать 1s. Таким образом, это заставляет меня думать, что присвоение номера одиночному битовому полю получает младший значащий бит (2 является 10 в двоичном и 3 является 11).

Итак, мой вопрос — это правильно и кроссплатформенно? Или это зависит от машины, от компилятора и т. Д. Стандарт говорит что-нибудь об этом, или это полностью определяется реализацией?

Примечание: тот же результат может быть достигнут путем назначения 0 а также 1, вместо 2 а также 3 соответственно. я использовал 2 а также 3 просто для иллюстрации моего вопроса, я бы не использовал его в реальной ситуации

Постскриптум И, да, я интересен обоими — C а также C++Пожалуйста, не говорите мне, что это разные языки, потому что я знаю это 🙂

1

Решение

Правила в этом случае ничем не отличаются от арифметики полной ширины. Битовые поля ведут себя так же, как и соответствующие полноразмерные типы, за исключением того, что их ширина ограничена значением, указанным в объявлении битового поля (6.7.2.1/9 в C99).

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

Присвоение значения переполнения битовому полю без знака использует правила арифметики по модулю, что означает, что значение берется по модулю 2^N, где N ширина битового поля. Это означает, например, что назначение четных чисел вашему битовому полю b всегда будет производить ценность 0в то время как присвоение нечетных чисел такому битовому полю всегда будет производить 1,

4

Другие решения

Других решений пока нет …