Почему логический 1 байт, а не 1 бит размера?

В С++,

  • Почему логический 1 байт, а не 1 бит размера?
  • Почему нет таких типов, как 4-битные или 2-битные целые числа?

Мне не хватает вышеуказанных вещей при написании эмулятора для CPU

Ответ 1

Потому что CPU не может адресовать что-либо меньшее, чем байт.

Ответ 2

От Wikipedia:

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

Таким образом, байтом является базовый адресный блок, ниже которого компьютерная архитектура не может адресовать. А поскольку нет (возможно) компьютеров, поддерживающих 4-битный байт, у вас нет 4-разрядных bool и т.д.

Однако, если вы можете спроектировать такую ​​архитектуру, которая может адресовать 4-разрядную базовую адресную единицу, тогда у вас будет bool размера 4-бит, тогда только на этом компьютере!

Ответ 3

Самый простой ответ: потому что процессор обрабатывает память в байтах, а не в битах, а побитовые операции очень медленные.

Однако возможно использовать распределение по битам в С++. Там std::vector специализация для битовых векторов, а также структуры, принимающие записи размера бит.

Ответ 4

В прежние времена, когда мне приходилось ходить в школу в бушующей метели, в горах в обе стороны и в обеденное время было какое-то животное, которое мы могли бы выследить в лесу за школой и убить голыми руками, компьютеры были намного меньше доступной памяти, чем сегодня. Первый компьютер, который я когда-либо использовал, имел 6 КБ ОЗУ. Не 6 мегабайт, не 6 гигабайт, 6 килобайт. В этой среде было очень важно собрать как можно больше булевых в int, и поэтому мы будем регулярно использовать операции, чтобы вытащить их и вставить их.

Сегодня, когда люди будут издеваться над вами за то, что у вас всего 1 ГБ ОЗУ, и единственное место, где вы можете найти жесткий диск с объемом менее 200 ГБ, находится в антикварном магазине, просто не стоит того, чтобы упаковывать биты.

Ответ 5

У вас могут быть 1-битные bools и 4 и 2-битные int. Но это создало бы странный набор команд для повышения производительности, поскольку это неестественный способ взглянуть на архитектуру. На самом деле имеет смысл "тратить" большую часть байта, а не пытаться восстановить неиспользуемые данные.

Единственное приложение, которое пытается упаковать несколько bools в один байт, по моему опыту, - это Sql Server.

Ответ 6

Вы можете использовать битовые поля для получения целых чисел субразмера.

struct X
{
    int   val:4;   // 4 bit int.
};

Хотя он обычно используется для сопоставления структур с точными аппаратными ожидаемыми битовыми шаблонами:

struct SomThing   // 1 byte value (on a system where 8 bits is a byte
{
    int   p1:4;   // 4 bit field
    int   p2:3;   // 3 bit field
    int   p3:1;   // 1 bit
};

Ответ 7

Поскольку байт - это наименьшая адресуемая единица в языке.

Но вы можете сделать bool взять 1 бит, например, если у вас есть куча из них например. в структуре, например:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};

Ответ 8

Поскольку, как правило, ЦП выделяет память с 1 байтом в качестве базового блока, хотя некоторые процессоры, такие как MIPS, используют 4-байтовое слово.

Однако vector имеет специальную форму bool, при этом vector<bool> выделяется один бит для каждого bool.

Ответ 9

bool может быть одним байтом - наименьшим адресуемым размером процессора или может быть больше. Нестандартно иметь bool размер int для целей производительности. Если для конкретных целей (например, аппаратное моделирование) вам нужен тип с N битами, вы можете найти библиотеку для этого (например, библиотека GBL имеет класс BitSet<N>). Если вы заинтересованы в размере bool (у вас, вероятно, есть большой контейнер), вы можете сами упаковать биты или использовать std::vector<bool>, который сделает это за вас (будьте осторожны с последним, так как он не удовлетворяет требования к контейнерам).

Ответ 10

Даже если минимальный размер может быть 1 байт, вы можете иметь 8 бит булевой информации на 1 байт:

http://en.wikipedia.org/wiki/Bit_array

Язык Джулии имеет BitArray, например, и я читал о реализациях С++.

Ответ 11

Логическое значение будет иметь один бит, если ваш процессор будет 1 бит процессора.

В общем случае размер бита процессора (например, 8 бит, 16 бит, 32 бит и т.д.) является мерой наименьшего размера данных, который может обрабатываться процессором - таким образом, это ТАКЖЕ размер адресное пространство. (Так как указатели и данные на разных уровнях одинаковы).

Ответ 12

Байт - это меньшая единица хранения цифровых данных компьютера. В компьютере ОЗУ имеет миллионы байт, и каждый из них имеет адрес. Если бы у него был адрес для каждого бита, компьютер мог бы управлять на 8 раз меньше ОЗУ, чем он может.

Дополнительная информация: Wikipedia

Ответ 13

Подумайте, как реализовать это на уровне эмулятора...

bool a[10] = {false};

bool &rbool = a[3];
bool *pbool = a + 3;

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);