10
votes

Taille des octets personnalisés?

Donc, vous savez comment la primitive de type caractère a la taille de 1 octet? Comment ferais-je faire une primitive avec une taille personnalisée? Donc, comme au lieu d'un Int avec la taille de 4 octets, j'en fais un avec la taille des lons. 16. Y a-t-il un moyen de faire cela? Y a-t-il un moyen autour de cela?


3 commentaires

Que voulez-vous accomplir avec cela? Est-ce de permettre à de plus gros nombres dans vos calculs ou d'avoir un autre plan pour vos grands entiers de 16 octets?


C'est une question intéressante, mais un peu sous-spécifié. Et les réponses ne répondent pas à la création de primitives plus grandes ou plus petites. Plus petit qu'un Char : Remplacez Opérateur et comme dans std :: vecteur :: itérateur . Plus grand qu'un long int : Utilisez une bibliothèque Bignum.


@Laserallan je veux utiliser ceci pour les mathématiques avec des primitives en C ++ que des chiffres sortent de la plage des primitives standard en C ++.


4 Réponses :


6
votes

Cela dépend de la raison pour laquelle vous le faites. Habituellement, vous ne pouvez pas utiliser de types de moins de 8 bits, car c'est l'unité adressable de l'architecture. Vous pouvez utiliser des structs, cependant, pour définir différentes longueurs:

struct s {
  unsigned int a : 4;  // a is 4 bits
  unsigned int b : 4;  // b is 4 bits
  unsigned int c : 16; // c is 16 bits
};


3 commentaires

uint16_t a toujours des problèmes d'endian.


@Billy Vrai ... Je suppose que je suppose que mon point est que les champs de morceaux dans les structures sont très désordonnés à cet égard, et c'est l'une de leurs utilisations principales.


Ouais. Je n'allais pas vous dire pour cela. Mais je pensais que cela mérite d'être mentionné.



5
votes

Normalement, vous feriez simplement une structure qui représente les données dans lesquelles vous êtes intéressé. S'il s'agit de 16 octets de données, c'est un agrégat d'un certain nombre de types plus petits ou que vous travaillez sur un processeur disposant d'un type d'intégral de 16 octets natif.

Si vous essayez de représenter des nombres extrêmement volumineux, vous devrez peut-être trouver une bibliothèque spéciale qui gère des numéros de taille arbitraire.


0 commentaires

0
votes

Si vous voulez faire un nouveau type, Typef it. Si vous voulez que ce soit 16 octets de taille, Typedef a STRIT contenant 16 octets de données de membre en elle. Attention à ce que des compilateurs assez souvent se détachent des choses sur vous pour répondre aux besoins d'alignement de vos systèmes. Une structure de 1 octet reste rarement 1 octets sans soin.


0 commentaires

3
votes

in c ++ 11, il y a une excellente solution pour cela: STD :: aligné_storage. XXX

Il vous permet de déclarer un bloc de stockage non initialisé sur la pile.


2 commentaires

Quel est le lien avec la question?


@JN. Outre le fait évident qui vous permet d'attribuer un stockage de la taille personnalisé sur la pile ou le tas, vous permet de définir ensuite des classes personnalisées d'un côté donné en utilisant les bonnes méthodes? Cela peut ne pas se comporter comme une primitive, mais si vous avez besoin d'une classe de taille personnalisée, il s'agit d'un excellent outil à utiliser (même comme une largeur personnalisée entier). C'est bien mieux que de définir un strict personnalisé avec des membres arbitraires de données.