La valeur maximale pour un type int en Aller
Comment spécifier la valeur maximale représentable par un unsigned
de type entier?
Je voudrais savoir comment initialiser min
dans la boucle ci-dessous que de façon itérative calcule min et max les longueurs de certaines structures.
var minLen uint = ???
var maxLen uint = 0
for _, thing := range sliceOfThings {
if minLen > thing.n { minLen = thing.n }
if maxLen < thing.n { maxLen = thing.n }
}
if minLen > maxLen {
//If there are no values, clamp min at 0 so that min <= max.
minLen = 0
}
de sorte que la première fois par le biais de la comparaison, minLen >= n
.
- prendre un coup d'oeil a cette extrait de
int(^uint(0) >> 1) // largest int
extrait de golang.org/doc/effective_go.html#printing
Vous devez vous connecter pour publier un commentaire.
https://groups.google.com/group/golang-nuts/msg/71c307e4d73024ce?pli=1
Le germane partie:
Comme par @CarelZA commentaire:
math
: golang.org/pkg/math/#pkg-constants, vous souhaitezmath.MaxInt32
le plus probable.https://golang.org/ref/spec#Numeric_types pour le type physique des limites.
Les valeurs maximales sont définies dans le paquet de maths donc dans votre cas: les maths.MaxUint32
Regarder comme il n'y a aucun débordement - incrémentation dernières max causes enveloppante.
uint
, pasuint32
. Lelen
etcap
utilisationint
pasint32
je tiens donc à utiliser quelque chose qui correspond à la taille de ceux sur toutes les architectures.math/const.go
définit un tas deMax<type>
mais aucun ne soituint
ou " int.uint(len(...)) < thing.minLen
mais je ne sais pas siuint64(int)
est et restera comportement défini.Je voudrais utiliser
math
paquet pour obtenir la valeur maximale et la valeur minimale :De sortie :
int64
's de débordement de type int, qui est ce qui arrive si vous n'avez pas explicitement le type des constantes avant de la chaîne d'interpolation. Utilisationint64(math.MaxInt64)
au lieu de cela, voir stackoverflow.com/questions/16474594/...J'ai d'abord utilisé le code de la discussion thread @nmichaels utilisé dans sa réponse. J'ai maintenant un peu différent de calcul. J'ai ajouté quelques commentaires au cas où quelqu'un d'autre a la même requête que @Arijoon
Les deux dernières étapes de travail en raison de combien de nombres positifs et négatifs sont représentés en complément à deux de l'arithmétique. Le langage Go de spécification de l'article sur Les types numériques renvoie le lecteur à la Article de Wikipedia. Je n'ai pas lu, mais j'ai appris à propos de complément à deux du livre Code de Charles Petzold, qui est très accessible intro les notions de base des ordinateurs et à la programmation.
J'ai mis le code ci-dessus (moins la plupart des commentaires) pour un peu de entier paquet de maths.
Une façon de résoudre ce problème est d'obtenir les points de départ à partir des valeurs elles-mêmes:
Résumé:
De fond:
Comme je suppose que vous le savez, le
uint
type est de la même taille que soituint32
ouuint64
, en fonction de la plateforme où vous vous trouvez. Généralement, on peut utiliser sans colle à la version de ceux-ci seulement quand il n'y a pas de risque de se rapprocher au maximum de la valeur, comme la version sans spécification de la taille peut utiliser le "natif" de type, en fonction de la plateforme, qui tend à être plus rapide.Noter qu'il a tendance à être "plus rapide", car à l'aide d'un non-autochtone de type nécessite parfois des supplémentaires de mathématiques et de vérification de limites à être exécutées par le processeur, afin d'imiter le plus grand ou plus petit entier. Avec cela à l'esprit, sachez que les performances du processeur (ou le compilateur optimisé le code) est presque toujours va être mieux que l'ajout de vos propres limites de vérification de code, donc si il n'y a aucun risque de venir en jeu, il peut être judicieux d'utiliser simplement la taille fixe de la version, et de laisser l'optimisation de l'émulation de gérer toutes les conséquences de cela.
Avec cela dit, il existe encore des situations où il est utile de savoir ce que vous travaillez avec.
Le package "mathématiques/bits" contient la taille de
uint
, en bits. Pour déterminer la valeur maximale, maj1
par le nombre de bits, moins 1. c'est à dire:(1 << bits.UintSize) - 1
Noter que lors du calcul de la valeur maximale de
uint
, vous aurez généralement besoin de mettre explicitement dans unuint
(ou plus) de la variable, sinon le compilateur peut échouer, car il sera, par défaut, de tenter d'attribuer ce calcul dans un signéint
(où, comme cela devrait être évident, il ne convient pas du tout), donc:C'est la réponse directe à votre question, mais il y a aussi un couple de calculs qui pourraient vous intéresser.
Selon la spec,
uint
etint
sont toujours de la même taille.Donc on peut aussi utiliser cette constante pour déterminer la valeur maximale de
int
, en prenant la même réponse et en divisant par2
puis en soustrayant1
. c'est à dire:(1 << bits.UintSize) /2 - 1
Et la valeur minimale de
int
, en déplaçant1
par le nombre de bits et en divisant le résultat par-2
. c'est à dire:(1 << bits.UintSize) /-2
En résumé:
MaxUint:
(1 << bits.UintSize) - 1
Exemple maxint:
(1 << bits.UintSize) /2 - 1
MinInt:
(1 << bits.UintSize) /-2
exemple complet (doit être le même que ci-dessous)