LINUX.ORG.RU

Не удивлюсь, если следующий вопрос будет: Есть ли в Си тип данных размером 1/2 бита?

pathfinder ★★★★
()

На лисп-машинах можно было адресовать произвольные интежеры. Под них были и конпеляторы Си. Были.

На x86, и большинстве других архитектур, двухбитового типа нет.

Love5an
()
Ответ на: комментарий от anon_666

спасибо Love5an и anon_666 Разобрался =) Да,речь шла об ANSI C

Genesis_39
() автор топика
Ответ на: комментарий от eliriand

В C99 есть _Bool, но sizeof(_Bool), разумеется не 1 бит, а байт.

anonymous
()
Ответ на: комментарий от eliriand

Должен быть _Bool, судя по стандартам.

6.2.5 Types

The meaning of a value stored in an object or returned by a function is determined by the type of the expression used to access it. (An identifier declared to be an object is the simplest such expression; the type is specified in the declaration of the identifier.) Types are partitioned into object types (types that fully describe objects), function types (types that describe functions), and incomplete types (types that describe objects but lack information needed to determine their sizes).

An object declared as type _Bool is large enough to store the values 0 and 1.

An object declared as type char is large enough to store anymember of the basic execution character set. If a member of the basic execution character set is stored in a char object, its value is guaranteed to be nonnegative.Ifany other character is stored in...

m4n71k0r
()

Извиняюсь за оффтоп, не знал что речь шла об ANSI C.

В общем Вам эти «виртуальные» типы всё равно придётся упаковывать в структурки, либо более крупные типы и использовать свою индексацию и прочее. Да, использовать битовые операции.

Небось, уже всё сделали до Вас.

m4n71k0r
()
struct my_struct {
        unsigned int my_var:2;
};

Как-то так

ttnl ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

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

$ cat > ./bool.c 
#include <stdio.h>

typedef enum { false = 0, true = 1 } bool;

int main(int argc, char ** argv)
{

    bool a;
    
    a = false;
    printf("%d\n", a);
    a = true;
    printf("%d\n", a);
    
    return 0;
}

$ gcc -o bool bool.c

$ ./bool 
0
1
Deleted
()
Ответ на: комментарий от Deleted

хотя наверное вот так было бы наглядней :)

printf («%s\n», a == true?«true»:«false»)

Deleted
()

Только в таком виде.

struct bit_struct {
  unsigned char bitfield:2;
};

При этом, естественно, массив из двух таких структур будет занимать 2 байта, в каждом из которых будет использовано только 2 младших (для little-endian) или старших (для big-ending) бита.

linuxfan
()
Ответ на: комментарий от Deleted

да нет, не из плюсов. в *BSD он живёт, где и положено в /usr/include, а вот в линуксе почему-то в /usr/lib/gcc/*/*/include.

beastie ★★★★★
()
Ответ на: комментарий от Deleted

> чем этот способ не удовлетворяет эстетическую потребность видеть булевский тип?

  1. ненужный велосипед;
  2. sizeof(bool) == sizeof(int).
arsi ★★★★★
()
Ответ на: комментарий от uGin

ты наивно полагаешь, что я это утверждал?

Deleted
()
Ответ на: комментарий от arsi

1. никто и не отрицает ибо я говорил про _эстетическую_потребность_ видеть булевую переменную и присущие ей значение true и false

2. ты тоже хотел мне рассказать про получаемый размер переменной как и uGin? ))

Deleted
()
Ответ на: комментарий от arsi

лично я сам никогда этой херней не маялся и, признаться даже не знал о существовании stdbool.h :), посему...

[code] $ locate stdbool.h /usr/include/c++/4.4/tr1/stdbool.h /usr/lib/gcc/x86_64-linux-gnu/4.4/include/stdbool.h [/code]

привело меня к этому умозаключению.

Deleted
()
Ответ на: комментарий от Deleted

> 2. ты тоже хотел мне рассказать про получаемый размер переменной как и uGin? ))

да, и подчеркнуть, что переменная этого типа не только будет больше бита, но и больше байта (4 байта на х86).

arsi ★★★★★
()
Ответ на: комментарий от arsi

>(4 байта на х86).

Обосраться! Аж три байта лишних.

Ну, не будем упоминать про то, что существуют архитектуры, на которых максимально адресуемая единица памяти это как раз байт, и на которых int, соответственно, равен char - видно, что дебилов с мозгом, разжиженным сями, плюсами и x86альтернативно умных это не интересует.

Но этим альтернативно умным будет полезно знать, что, например, сишный стек на x86 всегда выровнен минимум по 4 байтам. А то и по 8ми. Ровно как и среднестатистическая структура или юнион. Ну и не лишним будет напомнить, что машинные слова x86 в памяти лежат обычно выровненными по 4 байтам, и соответственно, процессор с ними работает быстрее, чем со всякой невыровненной мелочью.

Love5an
()
Ответ на: комментарий от Love5an

>А то и по 8ми. Ровно как и среднестатистическая структура или юнион.
Соответственно, ко всякому мелкому говну и так добавляется паддинг до соответствующего размера.

Love5an
()

if(CheckListBox1->Checked[CheckListBox1->ItemIndex]==true) Poll |= (t<<CheckListBox1->ItemIndex); else Poll -= (t << CheckListBox1->ItemIndex);

Бинарной логикой.

Boxxy
()
Ответ на: комментарий от arsi

срач плавно перешел в другое русло :))) я и без лишних упоминаний прекрасно понимаю, что тот же int это далеко не бит и даже не байт. а вот про stdbool действительно не знал. читал стандарт по диагонали, не въедаясь в малоюзабельные (для меня) вещи ибо всякая экзотика только усложняют жизнь в разработке и провоцирует разного рода аномалии в виде багов. для меня есть одно правило - нужно писать просто и понятно. ты ведь читал про «эволюцию программиста»? ;)

Deleted
()
Ответ на: комментарий от Deleted

>я и без лишних упоминаний прекрасно понимаю, что тот же int это далеко не бит и даже не байт.

Теперь уже - может быть.

читал стандарт по диагонали

facepalm.exe

для меня есть одно правило - нужно писать просто и понятно.

Быдлокодинг - это «просто и понятно» только для быдлокодера, читающего стандарт «по диагонали»

Led ★★★☆☆
()
Ответ на: комментарий от Deleted

> …ибо всякая экзотика…

bool — это экзотика? о_О у меня даже слов нет =)

> ты ведь читал про «эволюцию программиста»? ;)

беллетристикой не увлекаюсь ;) лучше лишний раз стандарт или маны перечитать, оно в работе больше пригодится ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

булевый тип для Си - экзотика. я видел сильно много исходников и нигде в сишных проектах не использовался булевый тип. для этих целей обходились зачастую char'ом или int'ом.

Deleted
()
Ответ на: комментарий от Deleted

> булевый тип для Си - экзотика.

этой «экзотике» одиннадцать лет исполнилось. вас в каком бункере столько лет держали? о_О

> я видел сильно много исходников и нигде в сишных проектах не использовался булевый тип.

лабы по турбо-си? ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

лабы по турбоссям кончились 16 лет назад :). давай не будем голословными - покажи хотя бы 3 опенсорсных проекта где эксплуатируется булевый тип в сишном коде. Если уж сильно хочется придраться к моим познаниям Си, велком - http://code.google.com/p/gsql/source/browse/trunk

не уподобляйся Led'у, того вообще не ровном месте заносит.

Deleted
()
Ответ на: комментарий от Deleted

> лабы по турбоссям кончились 16 лет назад :)

но последствия оказались фатальными ;)

> давай не будем голословными - покажи хотя бы 3 опенсорсных проекта где эксплуатируется булевый тип в сишном коде.

в гугле забанили, или танцору что-то другое мешает? ;)

1) php; 2) zsnes; 3) mesa; 4) kde(!) (3rd-party c-sources); 5) gccxml (ныне покойный, да)… (это из сорцов, которые у меня были, по тем или иным причинам.)

> Если уж сильно хочется придраться к моим познаниям Си, велком - http://code.google.com/p/gsql/source/browse/trunk

epic fail, да %) (правда, я только один сишный файл смотрел, но мне было достаточно…)

автору сорцов приписываю принимать маны, доки и другие полезные источники информации, внутриглазно… ибо это полный ахтунг…

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.