Je recommande OP approche.
Pour l'OP du petit exemple, le 2-dessous sera probablement effectuer la même.
uint64_t var = 1;
// OP solution)
var ^ ( (uint64_t) 1 << 43 )
// Others suggested answer
var ^ ( 1ULL << 43 )
Les résultats ci-dessus ont la même valeur, mais de types différents. La différence de potentiel réside dans la façon de 2 types existent dans C: uint64_t
et unsigned long long
, et ce qui pourrait suivre.
uint64_t
a une portée exacte de 0 à 264-1.
unsigned long long
a une plage de 0 à au moins 264-1.
Si unsigned long long
sera toujours : 64-bits, comme il semble être sur une machine il ya beaucoup de jours, il n'y a pas de problème, mais regardons vers l'avenir et dire que ce code a été exécuté sur une machine où unsigned long long
était de 16 octets (0 à au moins 2128-1).
Un exemple artificiel ci-dessous: Le premier résultat de l' ^
est uint64_t
, lorsqu'il est multiplié par 3, le produit sera encore uint64_t
, la réalisation d'un modulo 264, devrait dépassement de se produire, alors le résultat est affecté d1
. Dans le cas suivant, le résultat d' ^
est unsigned long long
et lorsqu'il est multiplié par 3, le produit peut être plus grand que 264 qui est alors attribué d2
. Donc, d1
et d2
ont une réponse différente.
double d1, d2;
d1 = 3*(var ^ ( (uint64_t) 1 << 43 ));
d2 = 3*(var ^ ( 1ULL << 43 ));
Si l'on veut travailler avec des unit64_t
, être cohérent. Ne pas assumer unit64_t
et unsigned long long
sont les mêmes. Si c'est OK pour votre réponse à un unsigned long long
, amende. Mais dans mon expérience, si l'on commence à l'aide fixe de taille moyenne de type uint64_t
, on ne veut pas que la variante de la taille des types de gâcher les calculs.