2

私は C コードの Java バインディングを書いていますが、C にはあまり詳しくありません。

uint64_t があり、int にキャストする必要があります。誰もそれを行う方法を知っていますか? (私のバインディングはジントを返します...)

4

6 に答える 6

6

通常、「uint64_t」のような正確な幅の整数を使用するのは正当な理由です。64ビット長ではない可能性のあるintにキャストすると、深刻な問題が発生する可能性があります...

于 2010-07-21T11:18:56.530 に答える
6

簡単な答え:

uint64_t foo;
int bar;
bar = foo;

foo技術的には、の値がに収まらない場合、これは未定義の動作になりますint。実際には、常に上位ビットを切り捨てるだけです。もっと正確になりたい場合は、次のようにします。

if (foo-INT_MIN <= (uint64_t)INT_MAX-INT_MIN)
    bar = foo;
else
    /* error case here */
于 2010-07-21T11:21:21.130 に答える
3

JNIラッパーを作成している場合、uint64_tに最適なのはintではなくlongです。それでも、Javaには符号なしの型(したがってu)がないため、精度が失われ、値の符号を確認する準備をする必要があります。

于 2010-07-21T11:22:05.590 に答える
2

javaは符号なし型をサポートしていないことに注意してください。Javaの最も近い型も64ビットであるため、長くなります。uint64をlongにキャストしても、ビット数は同じであるためデータが失われることはありませんが、大きな値は負の数として表示されます。

于 2010-07-21T11:19:35.843 に答える
1
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
于 2010-07-21T11:19:06.370 に答える
0

うーん... uint64_t 番号である page_ID を返す C のメソッドがあります。次に、その数値を Java HashMap に格納する必要があります。では、その uint64_t を Java HashMap に格納する最良の方法は何でしょうか? 問題は、ルックアップ操作を行うときに、HashMap でその特定の値を取得し、それを uint64_t にキャストして戻す必要があることです。これにより、引数として uint64_t を予期する C コードで関数を呼び出すことができます。

PS私は jlong​​ pid = (jlong​​) pid_in_uint64_t; でそれをやった ここまでは順調ですね...

于 2010-07-21T11:32:58.233 に答える