Est-il possible de créer un type de données de longueur un bit en C

Essentiellement, je veux créer un type de données uint1_t . Est-ce que c’est possible?

Je sais que la taille du type de données bool est un octet. Mais les valeurs booléennes n’ont besoin que d’un bit. Donc, C utilise-t-il un seul bit pour bool? Si oui, alors que fait-il avec les sept autres. L’utilisation de huit bits où un est suffisant semble un tel gaspillage d’espace.

Il n’est pas vraiment possible de créer un type qui occupe un bit. La plus petite unité adressable dans C est le caractère (qui est par définition un octet et généralement, mais pas nécessairement, long de 8 bits; il peut être plus long mais ne doit pas être inférieur à 8 bits dans la norme C).

Vous pouvez l’approcher avec:

 typedef _Bool uint1_t; 

ou:

 #include  typedef bool uint1_t; 

mais il occupera (au moins) un octet, même si une variable booléenne ne stocke que les valeurs 0 ou 1, false ou true . Vous pouvez également utiliser un champ de bits:

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

mais cela occupera également (au moins) un octet et vous devrez utiliser .x pour accéder à la valeur.

Contrairement à ce que certains pensent, il existe un type de données d’un bit dans C99: il s’appelle _Bool . Vous pouvez également déclarer des champs de bits de taille 1. Le fait que des bits individuels ne soient pas adressables en C ne signifie pas que des types de données à un bit ne peuvent pas exister. Cet argument consiste essentiellement à comparer des pommes à des oranges.

Il n’y a cependant pas de type dont la taille de stockage ( sizeof ) est inférieure à un octet.

Non ce n’est pas possible, uint8_t est le plus petit type de données. Dans struct, vous pouvez utiliser des champs de bits, outre le fait qu’il ne soit pas possible d’avoir un type de données de 1 bit seulement.

Le plus petit object que vous pouvez créer a un sizeof == 1 . Cet object aura une taille en bits de CHAR_BIT qui, sur presque toutes les plates-formes que vous verrez, sera de 8.

Donc, le plus petit object que vous pouvez créer est un int8_t aka char .

Vous pouvez utiliser des champs de bits pour coder de nombreux nombres à 1 bit dans un object plus volumineux, mais ce n’est pas exactement une solution à votre problème.

La chose la plus proche à laquelle vous pouvez arriver est d’utiliser des champs de bits. Ils sont configurés dans une struct et chaque champ de la struct détermine sa largeur.

Exemple:

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

Ce cas «gaspille» toujours les autres bits de l’ int mais si vous aviez d’autres champs, vous pouvez utiliser efficacement chaque bit de l’ int pour représenter une valeur booléenne.

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

La réponse courte est “non”; À l’exception des champs de bits, tous les types doivent correspondre à un nombre entier d’octets (et plusieurs champs de bits occuperont le même octet s’ils peuvent tous y entrer).

De la bouche du cheval :

6.2.6 Représentations des types

6.2.6.1 Généralités

1 Les représentations de tous les types ne sont pas spécifiées, à l’exception de ce qui est indiqué dans le présent sous-paragraphe.

2 Sauf pour les champs de bits, les objects sont composés de séquences contiguës d’un ou plusieurs octets, dont le nombre, l’ordre et le codage sont soit spécifiés explicitement, soit définis par l’implémentation.

3 Les valeurs stockées dans des champs de bits non signés et des objects de type unsigned char doivent être représentées à l’aide d’une notation binary pure. 49)

4 Les valeurs stockées dans des objects autres que des CHAR_BIT bits de tout autre type d’object sont composées de n × bits CHAR_BIT , n étant la taille en octets d’un object de ce type. La valeur peut être copiée dans un object de type unsigned char [ n ] (par exemple, par memcpy ); l’ensemble d’octets résultant est appelé la représentation d’object de la valeur. Les valeurs stockées dans des champs de bits consistent en m bits, où m est la taille spécifiée pour le champ de bits. La représentation de l’object est l’ensemble des m bits que le champ de bits comprend dans l’unité de stockage adressable le contenant. Deux valeurs (autres que NaN) avec la même représentation d’object se comparent égales, mais les valeurs se comparant égales peuvent avoir des représentations d’object différentes


49) Une représentation de position pour les entiers utilisant les chiffres binarys 0 et 1, dans laquelle les valeurs représentées par les bits successifs sont additives, commencent par 1 et sont multipliées par des puissances entières successives de 2, sauf peut-être le bit avec la position la plus haute. (Adapté du dictionnaire national américain des systèmes de traitement de l’information .) Un octet contient des bits CHAR_BIT et les valeurs de type unsigned char vont de 0 à 2 CHAR_BIT − 1 .

N ° 8 bits est la taille minimale pour un type. Vous pouvez utiliser un champ de bits pour combiner plusieurs “petits” éléments si vous avez vraiment besoin d’un stockage sous-octet.

Cependant, c’est rarement un gros problème. Les machines ont beaucoup de mémoire et il est rarement nécessaire de s’inquiéter de ce type de perte de mémoire.

Oui, vous pouvez créer une variable à un bit suppose int a: 1; Vous pouvez simplement lui atsortingbuer une valeur mais vous ne pouvez pas le scanner.