Jump to content
Korean Random
Pavel3333

Почему булевая переменная в реальности равна 1 байту, а не 1 биту?

Recommended Posts

В C89 нет такого типа

Понял!

И рендеринг это очень сложная штука с просчетом всего, что только возможно. Память там явно не под bool отдается, а под кэширование..

Это ясно. Но при рендеринге, когда памяти остается буквально 100-200 МБ, интерфейс 3D-редактора и всё связанное с ним становятся обузой.

Была у меня сцена на 1.5 минуты на конкурс к 23 февраля (в котором занял 3-е место, хотя это не важно), и она рендерилась с 12 часов дня до пяти часов утра! При этом я это делал по нескольку раз (не хватало памяти, тогда ее вообще 2 ГБ было, хоть и Макс 32 бита), включая примочки типа кэширования в файл и прочего. Могу еще кое-что рассказать, к примеру, как тогда я возненавидел MPEG формат, но это будет совсем не по теме.
Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites

 

 

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

 

Зависит от задачи) И если это не энтерпрайз для древнего стака, а пользовательский софт для современной среды исполнения, то пренебрегать не только "не нельзя", а даже нужно)

Share this post


Link to post

Short link
Share on other sites

Зависит от задачи) И если это не энтерпрайз для древнего стака, а пользовательский софт для современной среды исполнения, то пренебрегать не только "не нельзя", а даже нужно)

Лол.

Назови хоть один компилятор, который может в C11) В C99 тоже не каждый может...

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

 

 

Назови хоть один компилятор, который может в C11

Pelles C может с 2012 года

Clang может с 01 Dec 2011

GCC, ICC - частично могут.

Share this post


Link to post

Short link
Share on other sites

В GCC (могу спутать) булевая переменная представляется как 1 БАЙТ, а не бит! Почему?

Работа с битами сложнее и медленнее, да и булевы переменные нужны не так часто.

Конечные автоматы, ООП и другие полезные штуки минимизируют потребность в булевых переменных.

 

Но ведь можно создать в одном байте восемь таких булей и обращаться как к массиву. Или так тоже нельзя делать?

Процессор умеет сравнивать лишь целые байты. К счастью, побитовые логические операции он тоже умеет.

Псевдокод алгоритма для 01010011:

01010011 AND 10000000
РЕЗУЛЬТАТ СРАВНИТЬ С 10000000
ЕСЛИ РАВНО, ТО TRUE
ИНАЧЕ FALSE

01010011 AND 01000000
РЕЗУЛЬТАТ СРАВНИТЬ С 01000000
ЕСЛИ РАВНО, ТО TRUE
ИНАЧЕ FALSE

01010011 AND 00100000
РЕЗУЛЬТАТ СРАВНИТЬ С 00100000
ЕСЛИ РАВНО, ТО TRUE
ИНАЧЕ FALSE

...

Это чтение. Запись предельно проста:

01010011 OR 00000100 = 01010111

01010011 XOR 01000000 = 00010011

 

Вывод: Это глупо даже в условиях ничтожного количества памяти, так как очень медленно и сложно.

Edited by Azbuka
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

булевая переменная представляется как 1 БАЙТ, а не бит! Почему?

Полезный наводящий вопрос по теме: что такое байт?

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@seriych намекал на это:

 

В большинстве вычислительных архитектур байт — это минимальный независимо адресуемый набор данных.
Edited by TwoPizza
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

намекал на это:
намекал на то, что вот это неправильный ответ:

 

 

Один байт равен восьми битам. 

 

Минимально адресуемой областью памяти на компьютере может быть не 8 бит. Соответственно и байт на таком устройстве будет не 8 бит. Ну и исходя из названия "минимально адресуемый" нетрудно догадаться, что и булева переменная тоже будет занимать в памяти не 8 бит, а этот самый не факт что восьмибитный байт.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Понял. Разные компьютеры с разными процессорами (а, значит, разными архитектурами), имеют разный размер одного байта. И потому проще представлять булевую переменную в одном байте. Байт может быть не равен 8 битам.

 

Но почему в школьных учебниках информатики байт приравнивают 8 битам? Это условный идеал?

Share this post


Link to post

Short link
Share on other sites
struct MyBools {
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
char b8:1;
};
Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites

В байте 8 бит!

@seriych говорит о чем-то схожем с секторами на жестких дисках... Наверное...

Нет, он говорит об этом:

 

Однако в истории компьютерной техники существовали решения с иными размерами байта (например, 6, 32 или 36 битов), поэтому иногда в компьютерных стандартах и официальных документах для однозначного обозначения группы из 8 битов используется термин «октет» (лат. octet). 

 

В байте не всегда 8 бит, хотя сейчас это стандарт де факто.

Edited by TwoPizza
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...