rubyを使用して、符号付きとして保存された符号なし整数を元の値に変換する
-
08-07-2019 - |
質問
Cプログラムは、64ビットの符号なし整数とみなすものを、int8として入力されるPostgresデータベースの列に配置します。 Postgresにとって、int8は常に「signed int8」です(「unsigned int8」などはありません)。 そのため、私が持っているRubyプログラムでは、Postgresから取得した数値をそのスペースの上半分に負として表示しています。
Rubyでその-ve整数を取得し、それをCプログラマーが意図した64ビットの unsigned 整数に変換する正しい方法は何ですか?
解決
Rubyの詳細はわかりませんが、数値が負の場合は基本的に2 ^ 64を追加する必要があります。これは、数値が2の補数として格納されていることを前提としています。これはほぼ確実に格納されます。
FYI、2の補数システムは、本質的に(たとえば)32ビットの数値をmod 2 ^ 32として扱います。これは、-1が2 ^ 32-1または0xFFFFFFFFと同じことを意味します。これは、ハードウェアレベルでの使用が本当に簡単であることがわかりました。
他のヒント
これは動作する可能性があります:
x += 0x1_0000_0000_0000_0000 if x < 0
巨大な定数は、通常のリテラルとして2から64番目です。アンダースコアを追加して、数値が実際に1の後に64ビットのゼロが続くことを確認しやすくしました。各16進数は、いつものように4ビットを表します。アンダースコアは標準のRuby構文です。
所属していません StackOverflow