Utilisation de ruby ??pour convertir les entiers non signés stockés comme étant redirigés vers la valeur d'origine

StackOverflow https://stackoverflow.com/questions/301259

Question

Un programme C place ce qu’il considère être des entiers non signés 64 bits dans une colonne d’une base de données Postgres de type int8. Pour Postgres, int8 est toujours 'signed int8' (rien de tel que 'unsigned int8'). Ainsi, le programme Ruby que je propose montre que les chiffres extraits de Postgres dans la partie supérieure de cet espace sont négatifs.

Quelle est la bonne façon, en Ruby, de prendre cet entier -ve et de le convertir en un entier unsigned de 64 bits que le programmeur C avait prévu?

Était-ce utile?

La solution

Je ne suis pas sûr des spécificités de Ruby, mais vous devez essentiellement ajouter 2 ^ 64 si le nombre est négatif. Cela suppose que le nombre est stocké en tant que complément à 2, ce qui est presque certainement le cas.

FYI, le système du complément à 2, il traite essentiellement un nombre (disons) de 32 bits comme un nombre mod 2 ^ 32. Cela signifie que -1 est la même chose que 2 ^ 32 - 1 ou 0xFFFFFFFF. Cela s'avère très simple à utiliser au niveau du matériel.

Autres conseils

Cela pourrait fonctionner:

x += 0x1_0000_0000_0000_0000 if x < 0

La constante énorme est 2 à la 64ème, comme un littéral normal. J'ai ajouté les traits de soulignement pour qu'il soit plus facile de vérifier que le nombre est bien un un suivi de 64 bits de zéros. Chaque chiffre hexadécimal représente quatre bits, comme toujours. Les caractères de soulignement correspondent à la syntaxe Ruby standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top