Je vous recommande de le faire exactement comme vous l'avez montré, car c'est le plus simple. Initialiser à -1
qui fonctionnera toujours , indépendamment de la représentation réelle du signe, alors que cela ~
aura parfois un comportement surprenant car vous devrez avoir le bon type d'opérande. Ce n'est qu'alors que vous obtiendrez la valeur la plus élevée d'un unsigned
type.
Pour un exemple de surprise possible, considérez celle-ci:
unsigned long a = ~0u;
Il ne stockera pas nécessairement un motif avec tous les bits 1 dans a
. Mais il créera d'abord un motif avec tous les bits 1 dans un unsigned int
, puis l'attribuera a
. Ce qui se passe quand il y unsigned long
a plus de bits, c'est que tous ne valent pas 1.
Et considérez celui-ci, qui échouera sur une représentation de complément non-deux:
unsigned int a = ~0; // Should have done ~0u !
La raison en est qu'il ~0
faut inverser tous les bits. Qui donnera à inverser -1
sur une machine de complément à deux ( ce qui est la valeur dont nous avons besoin!), Mais pas céder -1
à une autre représentation. Sur une machine à complément à un, cela donne zéro. Ainsi, sur une machine à complément à un, ce qui précède s'initialise a
à zéro.
Ce que vous devez comprendre, c'est qu'il s'agit de valeurs - pas de bits. La variable est initialisée avec une valeur . Si dans l'initialiseur vous modifiez les bits de la variable utilisée pour l'initialisation, la valeur sera générée en fonction de ces bits. La valeur dont vous avez besoin pour initialiser a
à la valeur la plus élevée possible est -1
ou UINT_MAX
. Le second dépendra du type de a
- vous devrez utiliser ULONG_MAX
pour un fichier unsigned long
. Cependant, le premier ne dépendra pas de son type, et c'est un bon moyen d'obtenir la valeur la plus élevée.
Nous ne parlons pas de savoir si -1
tous les bits sont un (ce n'est pas toujours le cas). Et nous ne parlons pas de savoir si ~0
tous les bits sont un (il en a, bien sûr).
Mais ce dont nous parlons est le résultat de la flags
variable initialisée . Et pour cela, seul-1
fonctionnera avec tous les types et machines.