Usando Ruby para converter não assinados inteiros armazenados como back assinado para o valor original

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

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top