Ruby를 사용하여 서명되지 않은 정수를 원래 값으로 되돌려 놓은 것으로 변환

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

문제

C 프로그래밍은 64 비트 부호없는 정수로 간주되는 것을 int8로 입력 한 Postgres 데이터베이스의 열에 표시됩니다. Postgres에게 int8은 항상 'int8에 서명'됩니다 ( '부호없는 int8'과 같은 것은 없습니다). 그래서 내가 가진 루비 프로그램은 그 공간의 상단 절반에서 Postgres에서 검색된 숫자를 음수로 보여줍니다.

Ruby에서 올바른 방법은 그 -Ve 정수를 가져 와서 64 비트로 변환합니다. 서명되지 않았습니다 C-Programmer가 의도 한 정수?

도움이 되었습니까?

해결책

루비 세부 사항은 확실하지 않지만 본질적으로 숫자가 음수 인 경우 2^64를 추가해야합니다. 그것은 그 숫자가 2의 보완 물로 저장된다고 가정합니다.

2의 보완 시스템 인 참고로 본질적으로 32 비트 번호를 모드 2^32로 취급합니다. 이것은 -1이 2^32-1 또는 0xffffffff와 동일하다는 것을 의미합니다. 이것은 하드웨어 수준에서 사용하기가 정말 간단한 것으로 판명되었습니다.

다른 팁

이것은 작동 할 수 있습니다 :

x += 0x1_0000_0000_0000_0000 if x < 0

거대한 상수는 정상적인 문자처럼 2에서 64 일입니다. 밑줄을 추가하여 숫자가 실제로 64 비트의 0이라는 것을 쉽게 확인할 수 있습니다. 각 16 진수는 언제나처럼 4 개의 비트를 나타냅니다. 밑줄은 표준 루비 구문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top