2

Cプログラムは、64ビットの符号なし整数と見なされるものを、int8と入力されたPostgresデータベースの列に配置します。Postgresにとって、int8は常に'signed int8'です('unsigned int8'のようなものはありません)。したがって、私が持っているRubyプログラムは、そのスペースの上半分にあるPostgresから取得した数値を負として表示します。

Rubyで、その-ve整数を取得し、Cプログラマーが意図した64ビットの符号なし整数に変換する正しい方法は何ですか?

4

2 に答える 2

5

Ruby の仕様についてはよくわかりませんが、基本的に、数値が負の場合は 2^64 を追加する必要があります。これは、数値が 2 の補数として格納されていることを前提としていますが、これはほぼ確実です。

参考までに、2 の補数システムは、基本的に (たとえば) 32 ビットの数値を mod 2^32 の数値として扱います。これは、-1 が 2^32 - 1 または 0xFFFFFFFF と同じであることを意味します。これは、ハードウェア レベルで使用するのが非常に簡単であることがわかります。

于 2008-11-19T07:48:42.450 に答える
5

これはうまくいくかもしれません:

x += 0x1_0000_0000_0000_0000 if x < 0

huge 定数は、通常のリテラルとして 2 ~ 64 です。アンダースコアを追加して、数値が実際に 1 の後に 64 ビットのゼロが続くことを確認しやすくしました。いつものように、各 16 進数は 4 ビットを表します。アンダースコアは標準の Ruby 構文です。

于 2008-11-19T07:56:38.267 に答える