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