Возможно ли создать тип данных длиной один бит в C
Как правило, я хочу создать тип данных uint1_t
. Возможно ли это?
Я знаю, что размер типа данных bool - один байт. Но логические значения нужны только одному биту. Так что C по существу использует только один бит для bool? Если да, то что он делает с другими семью. Использование восьми бит, где это достаточно, кажется такой пустой тратой пространства.
Ответы
Ответ 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;
Вы можете просто присвоить ему значение, но не можете отсканировать его.