В C, сколько места занимает bool (булево)?Это 1 бит, 1 байт или что-то еще? - PullRequest
16 голосов
/ 04 ноября 2011

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

Ответы [ 9 ]

18 голосов
/ 04 ноября 2011

Если вы ссылаетесь на C99 _Bool, попробуйте:

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

Обратите внимание, что стандарт гласит:

6.2.5

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

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

7 голосов
/ 04 ноября 2011

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

3 голосов
/ 04 ноября 2011

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

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

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

1 голос
/ 04 ноября 2011

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

Почему в c ++ символы char и bool имеют одинаковый размер?

0 голосов
/ 04 ноября 2011

Обычно занимает один байт (8 бит). Обычный код, который я использую, чтобы убедиться, что размеры шрифтов соответствуют следующим. Пример вывода в комментарии говорит, что мой символ равен 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;
}
0 голосов
/ 04 ноября 2011

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

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

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

0 голосов
/ 04 ноября 2011

Нет логического типа. При переходе нулевое значение рассматривается как ложное, а все остальные - как истинное.

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

0 голосов
/ 04 ноября 2011

Неважно, 32-битная или 64-битная версия, это размер инструкций для процессора, совсем другое дело.

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

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

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

0 голосов
/ 04 ноября 2011

C имеет bool , но его часто моделируют с помощью байтового хранилища (то есть символа)http://cboard.cprogramming.com/c-programming/109520-bool-c.html

...