C11 считает смежные именованные битовые поля частью одной и той же ячейки памяти.Такие битовые поля не гарантированно обновляются атомарно, другими словами, если одно обновление не упорядочено явно перед другим, поведение не определено.3.14 memory location
также содержит подробное объяснение того, когда два поля можно считать находящимися в разных ячейках памяти, поэтому их обновления можно рассматривать независимо.
Если вы измените свою структуру
struct S0 {
unsigned f0:4;
int :0;
signed f1:4;
} l_62;
, так что между этими двумя битовыми полями существует этот причудливый «разделитель расположения памяти», ваш код гарантированно будет в порядке.
Для C99 дело кажется более сложным, нет такого подробногопонятие места памяти.В недавнем обсуждении списка рассылки ядра Linux было заявлено, что, как правило, для всех пар битовых полей гарантируется атомарность при обновлении любого из них.Отправной точкой этого обсуждения был случай, когда gcc неожиданно загрязнил соседнее с битовым полем битовое поле, что привело к ложным сбоям.