Calculer et utiliser le maximum de valeur de uint32_t
Je sais que UINT32_MAX
existe, mais je n'ai pas été capable de l'utiliser. J'ai essayé printf("%d\n", UINT32_MAX);
et l'imprimer -1
. À l'aide de %ld
au lieu de %d
m'a présenté avec l'erreur que UINT32_MAX
est de type unsigned int et les besoins %d
qu'à l'imprimer.
S'il vous plaît aider, ce que j'idéalement veux, c'est un macro/enum qui détient la valeur maximale de word_t
qui est un type défini par moi qui est actuellement uint32_t
.
J'espère que j'ai précisé ce que je veux, si non n'hésitez pas à demander.
MODIFIER
J'ai oublié de dire ce que je suis en train d'essayer de faire. Tout cela sera utilisé pour définir un tableau d'entiers à leur valeur maximale, parce que le tableau d'entiers est en fait une image bitmap qui vont mettre tous les bits à 1.
- Si vous souhaitez définir un entier non signé de tous les bits à 1, alors il suffit d'attribuer
-1
à elle. Le type n'a pas d'importance (tant qu'il est non signé), la représentation des entiers signés sur la mise en œuvre n'a pas d'importance, et vous n'avez pas besoin de connaître le nom de la macro pour la bonne valeur max (ce qui les rend plus facile à traiter avec des typedefs susceptible de changer dans le futur). - Jessop: Est-ce tout simplement accidentelle comportement ou pouvez-vous vraiment compter sur elle?
- il est garanti par la norme. Signé-à-unsigned de conversion est 6.3.1.3/2, et la représentation des unsigned int types est 6.2.6.2/1 (bien qu'en réalité vous ne vous inquiétez pas à propos de la représentation de stockage, vous venez de soins que
-1
est converti en unsigned par "ajouter un de plus que la valeur maximale qui peut être représenté dans le nouveau type", et donc-1
converti à tout type non signé est UTYPE_MAX). - Je sais qu'il peut être inutile de parler d'une "bonne" façon... mais qui ne devrait pas ~0 de mieux que de -1... je veux dire, ~0 est ce que vous voulez vraiment, -1 donne juste ~0 comme un effet secondaire de l'addition/soustraction.
Vous devez vous connecter pour publier un commentaire.
Le portable de façon à l'impression d'un
uintN_t
objet est à la convertir en uneuintmax_t
et l'utilisation de laj
modificateur de longueur avec leu
indicateur de conversion:La
j
signifie que l'argument est unintmax_t
ou unuintmax_t
; lau
signifie qu'il est non signé, c'est donc unuintmax_t
.Ou, vous pouvez utiliser le format des chaînes définies dans
<inttypes.h>
(n ce cas, vous devriez utiliserPRIu32
):Vous ne pouvez pas utiliser
%u
parce qu'il n'est pas garanti queint
est représenté par au moins 32 bits (il ne doit être représenté par au moins 16 bits).j
spécificateur de format moyen?PRIu32
dansinttypes.h
, pour le cas où la chaîne de format est défini dans le même code source que leprintf
déclaration. Si la chaîne de format est défini quelque part d'autre qui pourrait ne pas être compatible, alors il n'est pas bon.printf
est l'INTERFACE utilisateur de la programmation. Je ne fais pas de l'Isu en C 😉long
est d'au moins 32 bits donc%lu
et(unsigned long)UINT32_MAX
jumelé ensemble doit être fine.- Vous rencontré votre problème spécifique car
%d
est une signature du formateur.Il y a un certain nombre de façons de le réparer (deux ont déjà été proposé), mais le vraiment manière correcte est d'utiliser les spécificateurs de format défini dans
<inttypes.h>
:%d
est pour les entiers signés. Utilisation%u
.EDIT: Ignorer cette réponse et l'utilisation de James, qui est plus complète.
int
est représenté par 16 bits?Si vous êtes à la définition d'un tableau de unsigned int max de valeurs vous pourriez le faire via memset:
memset(tableau, 0xFF, sizeof(unsigned int) * arraysize);
uint32_t
.CHAR_BIT == 8
, c'est correct pouruint32_t
(comme dans la question), caruint32_t
est la garantie de ne pas avoir de remplissage bits. Techniquement c'est pas portable pourunsigned int
, depuis que est permet d'avoir les padding bits et si oui, cela pourrait créer un piège de la représentation. Mais nous savons aussi que d'après la question sur la mise en œuvre de l'interlocuteur, les deux types sont les mêmes de toute façon. Donc +1 pour faire face à une injustifiée -1.0xFF
est liées àuint32_t
, en supposant 8 bits octets. Avec 16 bits, octets, ce serait faux, donc mieux vaut utiliser-1
que0xff
.uint32_t
peut exister, c'est siCHAR_BIT
est de 8, 16 ou 32. L'hypothèse irait loin, si vous venez de remplacer0xFF
avec-1
. 🙂