rubyを使用して、符号付きとして保存された符号なし整数を元の値に変換する

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

質問

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構文です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top