Wiener 0 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба Всем доброго времени суток. Пишу на C под CW6.1 и столкнулся с отсутствием типа bool как таковой. Вернее тип есть, если подключить библиотеку, но при этом по факту переменная получается int и соответственно занимает 2 байта (1 байт если беззнаковый). Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно. Тип bool практически всегда занимает столько же места, сколько и int. Если вам нужен именно бит, копайте в сторону bitfields. Если ваш компилятор позволяет, их можно объединить в анонимную структуру. Если нет - придется структуру обозвать. P.S. что-то цитирование поломалось... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба В 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) Угу. Какая-то беда с цитированием приключилась. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_man_show 0 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба Прошу прощения за отступление от темы, вынужден проверить возможности цитрования по запросу пользователя Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно. Все заработало, слегка поправил настройки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба По стандарту 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 и т.д. (см. выше). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 1 сентября, 2008 Опубликовано 1 сентября, 2008 · Жалоба Дык никто и не запрещает переопределить типы данных и пользоваться своими (одинаковыми) типами на различных платформах. Вот только с битовым типом bool я бы не рискнул связываться. В крайнем случае сделать его 8-ми битовым типом unsigned char. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wiener 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Решение найдено. typedef struct { char b0:1; ... char b7:1; } bit1byte; bit1byte Status; if (Status.b0 = 0x1) { // BRSET ... } Status:b0 = 0x1; // BSET При этом можно использовать и больше одного байта для флагов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Решение найдено.Ваше решение называется bitfields. Я вам о нем написал в первом же ответе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба ... Я вам о нем написал в первом же ответе. Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wiener 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-) Я читал все ответы, просто для остальных интересующихся данным вопросом привёл рабочий пример, дабы полностью закрыть вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться