Присвоение значения битовому полю с длиной 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 s в своих полях, а three будут содержать 1 с. Таким образом, это заставляет меня думать, что присвоение числа однобитовому полю получает наименее значимый бит ( 210 в двоичном и 311 ).

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

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

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

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

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

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