¿Es posible crear un tipo de datos de longitud un bit en C?

Esencialmente quiero crear un tipo de datos uint1_t . ¿Es eso posible?

Sé que el tamaño del tipo de datos bool es de un byte. Pero los valores booleanos solo necesitan un bit. Entonces, ¿C solo usa un bit para bool? Si es así, ¿qué hace con los otros siete? Usar ocho bits donde uno es suficiente parece un desperdicio de espacio.

Realmente no es posible crear un tipo que ocupe un bit. La unidad direccionable más pequeña en C es el char (que es, por definición, un byte y usualmente, pero no necesariamente, tiene una longitud de 8 bits; puede ser más larga pero no se permite que sea más corta que 8 bits en el Estándar C)

Puedes abordarlo con:

 typedef _Bool uint1_t; 

o:

 #include  typedef bool uint1_t; 

pero ocupará (al menos) un byte, aunque una variable booleana solo almacena los valores 0 o 1, false o true . También podría utilizar un campo de bits:

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

pero eso también ocupará (al menos) un byte y deberá usar .x para acceder al valor.

Contrariamente a lo que algunas personas creen, hay un tipo de datos de un bit en C99: se llama _Bool . También puede declarar campos de bits de tamaño 1. El hecho de que los bits individuales no sean direccionables en C no significa que no puedan existir tipos de datos de un bit. Ese argumento es básicamente comparando manzanas con naranjas.

No hay, sin embargo, un tipo cuyo tamaño de almacenamiento ( sizeof ) sea menor que un byte.

No, esto no es posible, uint8_t es el tipo de datos más pequeño. Dentro de la estructura se podrían usar campos de bits, además de que no es posible tener un tipo de datos de solo 1 bit.

El objeto más pequeño que puede crear tiene un sizeof == 1 . Ese objeto tendrá un tamaño de CHAR_BIT bits, que en casi todas las plataformas que verás, tendrán 8.

Así que el objeto más pequeño que puedes crear es un int8_t aka char .

Puede hacer cosas con los campos de bits para codificar muchos números de 1 bit en un objeto más grande, pero eso no es exactamente una solución a su problema.

Lo más cercano a lo que se puede llegar es usar campos de bits. Se configuran dentro de una struct y cada campo de la struct determina su ancho.

Ejemplo:

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

Este caso aún “desperdicia” los otros bits del int pero si tuviera otros campos, podría usar efectivamente cada bit del int para representar un valor booleano.

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

La respuesta corta es “no”; a excepción de los campos de bits, todos los tipos deben asignarse a un número entero de bytes (y varios campos de bits ocuparán el mismo byte si todos pueden encajar).

De la boca del caballo :

6.2.6 Representaciones de tipos.

6.2.6.1 General

1 Las representaciones de todos los tipos no están especificadas, excepto lo indicado en esta subcláusula.

2 Excepto por los campos de bits, los objetos están compuestos por secuencias contiguas de uno o más bytes, cuyo número, orden y encoding se especifican explícitamente o se definen por implementación.

3 Los valores almacenados en campos de bits sin firmar y objetos de tipo unsigned char se representarán utilizando una notación binaria pura. 49)

4 Los valores almacenados en objetos sin campo de bits de cualquier otro tipo de objeto consisten en n × CHAR_BIT bits, donde n es el tamaño de un objeto de ese tipo, en bytes. El valor se puede copiar en un objeto de tipo unsigned char [ n ] (por ejemplo, por memcpy ); El conjunto resultante de bytes se denomina representación del objeto del valor. Los valores almacenados en campos de bits consisten en m bits, donde m es el tamaño especificado para el campo de bits. La representación del objeto es el conjunto de m bits que comprende el campo de bits en la unidad de almacenamiento direccionable que lo contiene. Dos valores (distintos de NaN) con la misma representación de objeto se comparan igual, pero los valores que comparan igual pueden tener diferentes representaciones de objeto


49) Una representación posicional para enteros que usa los dígitos binarios 0 y 1, en la que los valores representados por bits sucesivos son aditivos, comienzan con 1 y se multiplican por potencias integrales sucesivas de 2, excepto quizás el bit con la posición más alta. (Adaptado del American National Dictionary para sistemas de procesamiento de información .) Un byte contiene los bits CHAR_BIT , y los valores de tipo unsigned char van de 0 a 2 CHAR_BIT − 1 .

No. 8 bits es el tamaño mínimo para un tipo. Puede usar un campo de bits para combinar varios elementos “pequeños” juntos si realmente necesita almacenamiento de sub-bytes.

Sin embargo, esto rara vez es un gran problema. Las máquinas tienen mucha memoria y rara vez es necesario preocuparse por este tipo de pérdida de memoria.

Sí, puede crear una variable de un bit, supongamos que int a: 1; Puede asignarle un valor, pero no puede escanearlo.