Usando Ruby para converter não assinados inteiros armazenadas como assinado de volta para o valor original

votos
2

Um programa C é 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 'assinado int8' (há tal coisa a ele como 'int8 sem assinatura'). Assim, o programa de Ruby Eu tenho mostra os números recuperados de 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 unsigned integer que o C-programador destina?

Publicado 19/11/2008 em 08:42
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

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 de um número (digamos) de 32 bits como um número MOD 2 ^ 32. Isto significa -1 é a mesma coisa que 2 ^ 32-1 ou 0xFFFFFFFF. Este acaba por ser muito simples de usar em um nível de hardware.

Respondeu 19/11/2008 em 08:48
fonte usuário

votos
5

Isso pode funcionar:

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.

Respondeu 19/11/2008 em 08:56
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more