Перейти к содержанию
    

Переменная типа bool

Всем доброго времени суток.

Пишу на C под CW6.1 и столкнулся с отсутствием типа bool как таковой.

Вернее тип есть, если подключить библиотеку, но при этом по факту переменная получается int и соответственно занимает 2 байта (1 байт если беззнаковый).

Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

 

Тип bool практически всегда занимает столько же места, сколько и int. Если вам нужен именно бит, копайте в сторону bitfields. Если ваш компилятор позволяет, их можно объединить в анонимную структуру. Если нет - придется структуру обозвать.

 

P.S. что-то цитирование поломалось...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Standard C (ANSI C) типа bool вообще нету. Его ввели только в C99. По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer и принимает значения true = 1 или false = 0. Определение типа bool находится в хедере stdbool.h.

ISO/IEC 9899:1999 (E) ©ISO/IEC

7.16 Boolean type and values <stdbool.h>

1. The header <stdbool.h> defines four macros.

2. The macro

bool

expands to _Bool.

3. The remaining three macros are suitable for use in #if preprocessing directives. They

are

true

which expands to the integer constant 1,

false

which expands to the integer constant 0, and

_ _bool_true_false_are_defined

which expands to the integer constant 1.

Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then

redefine the macros bool, true, and false.

213)

 

Угу. Какая-то беда с цитированием приключилась. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения за отступление от темы, вынужден проверить возможности цитрования по запросу пользователя

 

Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

 

Все заработало, слегка поправил настройки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer...

Я не совсем понял, что значит "_Bool ... имеет размерность integer". Если это значит, что переменная типа _Bool будет занимать столько же байт, что и переменная типа int, то это неверно. В стандарте C99 это нигде не сказано. К тому же, например, компилятор Си для ColdFire от фирмы Green Hills выделяет под переменные типа _Bool 1 байт, в то время как int занимает 4 байта. На мой взгляд, Green Hills знает толк в компиляторах, по крайней мере код генерится отличный.

Однако, не стоит ожидать, что _Bool сможет занимать один бит, кроме как в битовых полях. Это связано с тем, что язык Си позволяет делать такие вещи, как опрелелять массивы _Bool, члены структур _Bool, выполнять адресную арифметику с переменными типа _Bool. Всё вышеперечисленное было бы очень трудно реализовать, если бы _Bool занимал только 1 бит.

Некоторые компиляторы определяют нестандартный тип для однобитовых переменных (скажем, bit). Можно заменить стандартный stdbool.h на свой, где будет "#define bool bit". Только при это не получится сделать массив типа bool, член структуры типа bool и т.д. (см. выше).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык никто и не запрещает переопределить типы данных и пользоваться своими (одинаковыми) типами на различных платформах. Вот только с битовым типом bool я бы не рискнул связываться. В крайнем случае сделать его 8-ми битовым типом unsigned char.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение найдено.

typedef struct {
char b0:1;
...
char b7:1;
} bit1byte;

bit1byte Status;

if (Status.b0 = 0x1) { // BRSET
...
}

Status:b0 = 0x1; // BSET

При этом можно использовать и больше одного байта для флагов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение найдено.
Ваше решение называется bitfields. Я вам о нем написал в первом же ответе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Я вам о нем написал в первом же ответе.

Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)

Я читал все ответы, просто для остальных интересующихся данным вопросом привёл рабочий пример, дабы полностью закрыть вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...