Предположим, у меня есть
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
будет содержать 1
s. Таким образом, это заставляет меня думать, что присвоение номера одиночному битовому полю получает младший значащий бит (2
является 10
в двоичном и 3
является 11
).
Итак, мой вопрос — это правильно и кроссплатформенно? Или это зависит от машины, от компилятора и т. Д. Стандарт говорит что-нибудь об этом, или это полностью определяется реализацией?
Примечание: тот же результат может быть достигнут путем назначения 0
а также 1
, вместо 2
а также 3
соответственно. я использовал 2
а также 3
просто для иллюстрации моего вопроса, я бы не использовал его в реальной ситуации
Постскриптум И, да, я интересен обоими — C
а также C++
Пожалуйста, не говорите мне, что это разные языки, потому что я знаю это 🙂
Правила в этом случае ничем не отличаются от арифметики полной ширины. Битовые поля ведут себя так же, как и соответствующие полноразмерные типы, за исключением того, что их ширина ограничена значением, указанным в объявлении битового поля (6.7.2.1/9 в C99).
Присвоение значения переполнения битовому полю со знаком приводит к поведению, определяемому реализацией, что означает поведение, наблюдаемое с битовым полем. a
как правило, не переносимый.
Присвоение значения переполнения битовому полю без знака использует правила арифметики по модулю, что означает, что значение берется по модулю 2^N
, где N
ширина битового поля. Это означает, например, что назначение четных чисел вашему битовому полю b
всегда будет производить ценность 0
в то время как присвоение нечетных чисел такому битовому полю всегда будет производить 1
,
Других решений пока нет …