Usando Ruby para converter não assinados inteiros armazenados como back assinado para o valor original
-
08-07-2019 - |
Pergunta
A C-programa é colocar o que considera ser de 64 bits inteiros sem sinal em uma coluna em um banco de dados Postgres que é digitado como int8. Para Postgres, int8 é sempre 'int8 assinado' (há tal coisa a ele como 'int8 sem assinatura'). Assim, o programa de Ruby Eu tenho números mostra recuperado do Postgres na metade superior do que o espaço como negativo.
O que é a maneira correta, em Ruby, para ter esse inteiro ve e convertê-lo para o 64-bit sem assinatura inteiro que o C-programador destina?
Solução
Eu não tenho certeza de especificidades de Ruby, mas, essencialmente, você precisa adicionar 2 ^ 64, se o número for negativo. Isso supondo que o número é armazenado como complemento para 2, o que é quase certo é.
FYI, sistema de complemento do 2 de, essencialmente, que trata um (digamos) 32-bit número como um número MOD 2 ^ 32. Este meio -1 é a mesma coisa que 2 ^ 32-1 ou 0xFFFFFFFF. Este acaba por ser muito simples de usar em um nível de hardware.
Outras dicas
Este trabalho poder:
x += 0x1_0000_0000_0000_0000 if x < 0
A enorme constante é de 2 a 64, como um literal normal. Eu adicionei os sublinhados para torná-lo mais fácil de verificar se o número é de fato um seguido por 64 bits de zeros. Cada dígito hex representa quatro bits, como sempre. Os sublinhados são sintaxe padrão do Ruby.