perasperaadastra wrote:Int для булева типа это расточительство в микроконтроллере, где каждый байт на счету.
Никакого расточительства тут на самом деле нет. Результат [почти] любого оператора в языке С - это rvalue, т.е. значение, которое существует лишь концептуально, как некий промежуточный результат в последовательности вычислений. Способ хранения этого промежуточного значения (если оно вообще где-то хранится) пользователю не виден и не доступен, поэтому компилятор может хранить его каким угодно образом - хоть в одном байте, хоть в одном бите. Ни один разумный компилятор не будет буквально интерпретировать спецификацию и явно выделять целый 'int' для хранения каждого преомежуточного rvalue с гарантированными значениями 0 и 1. Зачем? Более того, в большинстве случаев, как уже говорилось выше, результаты таких операций зачастую вообще становятся лишь флагами состояния процессора после выполнения операции сравнения. А далее, на основе этих флагов выполняется (или не выполняется) условный переход.
Так что ни к какой "расточительности" это не приводит. То, что "логический" результат операции в С имеет тип 'int', имеет своей целью лишь гарантировать семантику арифметических операций над такими результатами, если вы вдруг захотите заняться такой арифметикой. Например, язык гарантирует, что выражение '(a > b) - (a < b)' порождает результат -1, 0 или +1 без возникновения каких-то арифметических переполнений.
perasperaadastra wrote:Выходит, выгоднее булевы переменные объявлять типом Char, или, если если логических перемен много, загонять их в индивидуальные биты общей переменной.
... А физическое хранение "булевских" значений в памяти - это уже совсем другой вопрос. Это ваш выбор. Язык вам говорит, что результат операции - это либо 0, либо 1, что значит, что вы можете выбрать соврешенно любой целочисленый тип для хранения этого значения. Язык вас никак здесь не огранчивает. Можете и в индивидуальные биты загонять.