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

Возможно ли создать тип данных длиной один бит в C

Как правило, я хочу создать тип данных uint1_t. Возможно ли это?

Я знаю, что размер типа данных bool - один байт. Но логические значения нужны только одному биту. Так что C по существу использует только один бит для bool? Если да, то что он делает с другими семью. Использование восьми бит, где это достаточно, кажется такой пустой тратой пространства.

4b9b3361

Ответ 1

Невозможно создать тип, который занимает один бит. Самая маленькая адресуемая единица в C - это char (которая по определению является одним байтом и обычно, но не обязательно, длиной 8 бит, она может быть длиннее, но не может быть короче 8 бит в стандарте C).

Вы можете подойти к нему с помощью:

typedef _Bool uint1_t;

или

#include <stdbool.h>
typedef bool uint1_t;

но он будет занимать (по крайней мере) один байт, хотя булева переменная сохраняет только значения 0 или 1, false или true. Вы также можете использовать бит-поле:

typedef struct
{
    unsigned int x : 1;
} uint1_t;

но это также займет (по крайней мере) один байт, и вам нужно будет использовать .x для доступа к значению.

Ответ 2

Вопреки мнению некоторых людей, есть тип данных одного бита в C99: он называется _Bool. Вы также можете объявлять битовые поля размером 1. Тот факт, что отдельные биты не адресуются в C, не означает, что однобитовые типы данных не могут существовать. Этот аргумент в основном сравнивает яблоки с апельсинами.

Однако не существует типа, размер хранилища (sizeof) меньше одного байта.

Ответ 3

Нет, это невозможно, uint8_t - наименьший тип данных. Внутри структуры вы можете использовать битовые поля, кроме того, что невозможно иметь тип данных всего 1 бит.

Ответ 4

Самый маленький объект, который вы можете создать, имеет sizeof == 1. Этот объект будет размером CHAR_BIT бит, который почти на каждой платформе, которую вы когда-либо увидите, будет равен 8.

Таким образом, самым маленьким объектом, который вы можете создать, является int8_t aka char.

Вы можете делать что-то с битовыми полями, чтобы кодировать много 1 битовых чисел в более крупный объект, но это не совсем решение вашей проблемы.

Ответ 5

Ближайшая вещь, к которой вы можете обратиться, - это использование битовых полей. Они настроены в пределах struct, и каждое поле struct определяет его ширину.

Пример:

struct foo
{
  unsigned int bla   :1;  /* this uses only 1 bit */
}

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

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

Ответ 6

Короткий ответ - "нет"; кроме бит-полей, все типы должны отображать целое число байтов (а несколько бит-полей будут занимать один и тот же байт, если они могут все подходить).

Из лошадиного устья:

6.2.6 Представления типов

6.2.6.1 Общие положения

1 Представления всех типов не указаны, кроме как указано в этом подпункте. 2 За исключением бит-полей объекты состоят из смежных последовательностей одного или нескольких байтов, номер, порядок и кодировка которых либо явно указаны, либо реализации.

3 Значения, хранящиеся в неподписанных битовых полях и объектах типа unsigned char, должны быть представленный с использованием чистой двоичной записи. 49)

4 Значения, хранящиеся в объектах без битового поля любого другого типа объекта, состоят из n × CHAR_BIT бит, где n - размер объекта этого типа, в байтах. Значение может быть скопировано в объект типа unsigned char [n] (например, memcpy); результирующий набор байтов называемое представлением объекта значения. Значения, хранящиеся в битовых полях, состоят из m бит, где m - размер, заданный для битового поля. Представление объекта представляет собой множество m бит бит-поле содержит в адресованном блоке хранения, удерживающем его. Два значения (другое чем NaNs) с одинаковым представлением объекта, сравнивают равные, но значения, которые сравнивают равные могут иметь разные представления объектов
49) Позиционное представление для целых чисел, которое использует двоичные цифры 0 и 1, в которых значения представленные последовательными битами, являются аддитивными, начинаются с 1 и умножаются на последовательный интеграл мощность 2, за исключением, возможно, бит с наивысшим положением. (Адаптировано из Американского национального Словарь для систем обработки информации.) Байт содержит бит CHAR_BIT, а значения тип unsigned char находится в диапазоне от 0 до 2 CHAR_BIT − 1.

Ответ 7

Нет. 8 бит - это минимальный размер для типа. Вы можете использовать бит-поле, чтобы объединить несколько "маленьких" элементов вместе, если вам действительно нужно хранилище подбайта.

Однако это редко бывает большим делом. Машины имеют много памяти, и редко приходится беспокоиться об этом виде отходов памяти.

Ответ 8

Да, вы можете создать одну битовую переменную, предположив int a: 1; Вы можете просто присвоить ему значение, но не можете отсканировать его.