В более старых стандартах C такой тип не был определен.Однако многие встроенные микроконтроллеры включают в себя специальные схемы, позволяющие эффективно обрабатывать однобитовые флаги;некоторые допускают такую обработку переменных, хранящихся в любом месте, в то время как другие допускают это только для переменных, хранящихся в определенной области памяти.Компиляторы для таких процессоров позволяют объявлять отдельные переменные статической длительности как тип «бит»;такие переменные обычно занимают только один бит памяти (выделяется, если необходимо, в пределах области, которая может приспособиться к такому использованию).Некоторые компиляторы допускают, чтобы автоматические переменные нерекурсивных подпрограмм объявлялись как «битовые», но молча считали их «статическими» (компоновщики, предоставляемые такими компиляторами, требуют, чтобы подпрограммы идентифицировали, какие другие подпрограммы они вызывают, и будут отклонять программыв котором подпрограммы, которые не помечены как входящие, вызывают друг друга взаимно-рекурсивным способом)переменные, как правило, могут устанавливать, очищать или переходить по значениям таких переменных быстрее и с меньшим количеством кода, чем они могут устанавливать, очищать или переходить по всем байтовым флагам;
Многие такие процессоры имеют очень небольшое количество оперативной памяти.На многих процессорах не стоит беспокоиться о том, занимают ли отдельные переменные (в отличие от элементов массива или структурных полей) бит или байт каждая.Однако на процессоре с 25 байтами памяти существует огромная разница между 16 флагами, берущими по одному байту каждый, и тем, что все 16 флагов объединены в два байта. По крайней мере, на тех компиляторах, которые я видел, битовые переменные нельзя использовать в качестве полей структуры или элементов массива, а также адреса одного из них.
Я недостаточно знаю о C99 или более поздних версиях стандартов C или C ++, чтобы знать, есть ли у них какая-либо концепция автономного битового типа, у которого нет адреса.Я не могу придумать причину, по которой такая вещь не должна быть возможной, особенно стандарты уже признают концепцию таких вещей, как структурные битовые поля, которые ведут себя подобно lvalues, но не имеют адресов.Некоторые линкеры могут не поддерживать такие переменные, но такие линкеры могут быть учтены, если сделать их фактический размер зависимым от реализации (на самом деле, кроме скорости программы или общего использования памяти, было бы невозможно определить, были ли даны такие переменные 1 или 64 биткаждый).