Типы с битами заполнения могут вести себя странно, если биты заполнения не содержат значений, ожидаемых для типа.В большинстве реализаций C89 биты заполнения не используются ни с одним из целочисленных типов, но C99 требует, чтобы реализации определяли такой тип: _Bool
.Чтение _Bool
, когда все его биты равны нулю, даст ноль.Запись любого ненулевого значения в _Bool
установит его биты в некоторый шаблон, который даст 1 при чтении.Запись в ноль установит биты в шаблон (который может быть или не быть все-бит-ноль), который при чтении даст 0.
Если в документации реализации не указано иное, любой битовый шаблон, кроме всехбиты ноль, которые не могли быть получены путем сохранения нулевого или ненулевого значения в _Bool
, представляют собой представление ловушки;Стандарт ничего не говорит о том, что произойдет, если будет предпринята попытка прочитать такое значение.Учитывая, например,
union boolChar { _Bool b; unsigned char c; } bc;
с сохранением нуля до bc.c
и чтением bc.b
даст ноль.Сохранение нуля или единицы в bc.b
установит bc.c
в значения, которые, если они будут записаны, приведут к тому, что bc.b
будет содержать ноль или единицу.Сохранение любого другого значения в bc.c
и чтение bc.b
приведут к неопределенному поведению.