Подтвердить что ты не робот

В C, сколько места занимает bool (boolean)? Это 1 бит, 1 байт или что-то еще?

В C сколько места занимает bool (boolean)? Это 1 бит, 1 байт или что-то еще? Имеет ли значение, является ли программа 32-разрядной или 64-разрядной?

4b9b3361

Ответ 1

Если вы имеете в виду C99 _Bool try:

printf("%zu\n", sizeof(_Bool)); /* Typically 1. */

Обратите внимание, что в стандарте указано:

6.2.5

Объект, объявленный как тип _Bool, достаточно велик, чтобы хранить значения 0 и 1.

Размер не может быть меньше одного байта. Но было бы законным быть больше одного байта.

Ответ 2

Самая маленькая адресуемая "вещь" в C - это char. Каждая переменная в C должна иметь уникальный адрес, поэтому ваш bool не может быть меньше этого. (Обратите внимание, что char не всегда 8 бит, хотя)

Ответ 3

В более старых стандартах C такого типа не было определено. Однако многие встроенные микроконтроллеры включают в себя специальные схемы, позволяющие эффективно обрабатывать однобитовые флаги; некоторые позволяют такую ​​обработку переменных хранить в любом месте, в то время как другие допускают ее только для переменных, хранящихся в определенном регионе памяти. Компиляторы для таких процессоров позволяют объявлять отдельные переменные статической продолжительности как "бит"; такие переменные, как правило, берут только один бит памяти (выделяются, если необходимо, в пределах региона, который может вместить такое использование). Некоторые компиляторы позволят автоматическим переменным нерекурсивных подпрограмм быть объявлены как "бит", но будут молча рассматривать их как "статические" (компоновщики, снабженные такими компиляторами, требуют, чтобы подпрограммы определяли, какие другие подпрограммы они вызывают, и откажутся от программ в которых подпрограммы, которые не помечены как повторные вызовы, взаимно-рекурсивно называют друг друга).

Несколько замечаний:

  1. Процессоры, компиляторы которых поддерживают "истинные" битовые переменные, обычно могут устанавливать, очищать или разветвлять на значения таких переменных быстрее и с меньшим количеством кода, чем они могут устанавливать, очищать или разветвлять по байтовым флагам;
  2. Многие из таких процессоров имеют очень небольшое количество оперативной памяти. На многих процессорах вопрос о том, занимают ли отдельные переменные (в отличие от элементов массива или структурных полей) бит или байт, не стоит беспокоиться. Однако на процессоре с 25 байтами памяти существует огромная разница между наличием 16 флагов, принимающих по одному байту, по сравнению с тем, что все 16 флагов объединены в два байта.
  3. По крайней мере, на компиляторах, которые я видел, битовые переменные не могут использоваться в качестве структурных полей или элементов массива, а также не принимать адрес одного из них.

    Я не знаю достаточно о C99 или более поздних версиях стандартов C или С++, чтобы узнать, есть ли у них концепция автономного типа бит, у которого нет адреса. Я не могу думать ни о какой причине, что такая вещь не может быть возможной, особенно стандарты уже признают концепцию таких вещей, как структурные битовые поля, которые ведут себя как lvalues, но не имеют адресов. Некоторые линкеры могут не поддерживать такие переменные, но такие компоновщики могут быть адаптированы, если их фактический размер зависит от реализации (действительно, помимо скорости программы или общего использования памяти, было бы невозможно определить, были ли заданы такие переменные 1 бит или 64 бита каждый).

Ответ 4

Обычно он занимает один байт (8 бит). Обычный код, который я использую, чтобы убедиться, что размеры шрифта - это то, что я думаю, что они следуют. Образец вывода в комментарии говорит, что мой char - 1 байт (8 бит), а тот же для bool.

/**
 * using gcc, you can compile this with the following command:
 *   g++ -otype-sizes type_sizes.cpp
 * and then run with with
 *   ./type-sizes
 *
 * output on my 64bit linux machine follows. Note that
 * the not-so-primitive types are reporting size on
 * the stack (the actual data in on the heap and is
 * not reported by sizeof()). To get the "length" of
 * these you can use vector<>::size() or string::length().

bits in a single char: 8

Sizes of primitive types:
  char:        1
  bool:        1
  short:       2
  int:         4
  long:        8
  long long:   8
  float:       4
  double:      8
  long double: 16

  Not so primitive types:
    string(""): 8
    string("Hello, World!"): 8
    vector<int>(0): 24
    vector<int>(10): 24

 *
 **/

#include <climits>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    cout << "bits in a single char: " << CHAR_BIT << endl
    << endl
    << "Sizes of primitive types:\n"
    << "  char:        " << sizeof(char) << endl
    << "  bool:        " << sizeof(bool) << endl
    << "  short:       " << sizeof(short) << endl
    << "  int:         " << sizeof(int) << endl
    << "  long:        " << sizeof(long) << endl
    << "  long long:   " << sizeof(long long) << endl
    << "  float:       " << sizeof(float) << endl
    << "  double:      " << sizeof(double) << endl
    << "  long double: " << sizeof(long double) << endl
    << endl
    << "  Not so primitive types:\n"
    << "    string(\"\"): " << sizeof(string("")) << endl
    << "    string(\"Hello, World!\"): " << sizeof(string("Hello, World!")) << endl
    << "    vector<int>(0): " << sizeof(vector<int>(0)) << endl
    << "    vector<int>(10): " << sizeof(vector<int>(10)) << endl
    << endl;
}

Ответ 7

это зависит от вашего компилятора. некоторые будут принимать 1 байт, некоторые размером int (иногда bool - это просто typedef или #define для int). Я даже видел bool как короткий.

однако не ожидайте, что это будет немного. необходимость любого указателя, который может быть лишен возможности void *, затем вернуться и сохранить такое же значение, делает невозможным, поскольку void * address bytes. Кстати, это одна из причин, почему отдельные поля (как в int myvalue: 2) не могут быть устранены.

обычно нет различий в 32 или 64 сборках, поскольку 32 или 64 бита связаны с размером указателя.

Ответ 8

Не имеет значения, находитесь ли вы в 32-разрядной или 64-разрядной версии, размер инструкций для процессора совершенно другой.

Bool принимает реальный 1 бит, так как вам нужно всего 2 разных значения. Однако, когда вы делаете sizeof (bool), он возвращает 1, что означает 1 байт. По практическим соображениям оставшиеся 7 бит заполнены.

вы не можете сохранить переменную размером менее 1 байт.

- > bool занимает 1 байт

Ответ 9

Булев не существует. При ветвлении значение нуля считается ложным, а все остальные - истинным.

Самый маленький тип в c - char, который берет один байт почти для каждой системы. Можно использовать биты char для хранения восьми булевых значений.

Ответ 10

Размер bool имеет тот же размер, что и int. Размер определяется целевым процессором. Если целевой процессор равен 8 бит, скомпилированный размер bool будет загружать 7 бит, оставляя 1 бит для включения или выключения. Компилятор С++ будет обрабатывать int и bool таким же образом.