Во многих реализациях языка, написанного для описания стандарта C, попытка написать N-байтовый объект в структуре или объединении повлияла бы на значение не более N байтов в структуре или объединении. С другой стороны, на платформе, которая поддерживает 8-битные и 32-битные хранилища, но не 16-битные хранилища, если кто-то объявил тип типа:
struct S { uint32_t x; uint16_t y;} *s;
, а затем выполнил s->y = 23;
без заботы о том, что случилось с двумя байтами после y
, было бы быстрее выполнить 32-битное сохранение в y
, слепо перезаписав два байта после него, чем выполнить пару 8-битных операций записи для обновления верхнего и нижние половины y
. Авторы Стандарта не хотели запрещать такое обращение.
Было бы полезно, если бы в стандарт было включено средство, с помощью которого реализации могли бы указывать, могут ли записи в структуру или члены объединения нарушать хранилище за их пределами, а программы, которые могут быть нарушены при таком нарушении, могут отказываться работать в реализациях, где он может произойти. Однако авторы Стандарта, вероятно, ожидали, что программисты, которые будут заинтересованы в таких деталях, будут знать, на каком оборудовании должна работать их программа, и, таким образом, будут знать, будут ли такие помехи памяти проблемой для такого оборудования. [117 ]
К сожалению, современные авторы компиляторов, по-видимому, интерпретируют свободы, которые должны были помочь реализациям необычного оборудования, как открытое приглашение проявить «креативность» даже при нацеливании на платформы, которые могут эффективно обрабатывать код без таких уступок.
Вы правильно установили бит: ИЛИ
с маской битов, которые вы хотите установить.
Биты очистки битов очень похожи: И
с одним дополнением битов, которые вы хотите очистить.
Предположим, у вас есть маска m с битами, установленными в 1 для всех битов, которые вы хотите установить или очистить, и 0 в противном случае:
Если вас интересует только один бит в позиции p (начиная с 0), маску просто выразить m = 1 << p
Обратите внимание, что я используя соглашения в стиле C, где:
При условии, что ваш OR 0x14 правильный, очистка будет:
И (НЕ 0x14)