私は C コードの Java バインディングを書いていますが、C にはあまり詳しくありません。
uint64_t があり、int にキャストする必要があります。誰もそれを行う方法を知っていますか? (私のバインディングはジントを返します...)
私は C コードの Java バインディングを書いていますが、C にはあまり詳しくありません。
uint64_t があり、int にキャストする必要があります。誰もそれを行う方法を知っていますか? (私のバインディングはジントを返します...)
通常、「uint64_t」のような正確な幅の整数を使用するのは正当な理由です。64ビット長ではない可能性のあるintにキャストすると、深刻な問題が発生する可能性があります...
簡単な答え:
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 */
JNIラッパーを作成している場合、uint64_tに最適なのはintではなくlongです。それでも、Javaには符号なしの型(したがってu)がないため、精度が失われ、値の符号を確認する準備をする必要があります。
javaは符号なし型をサポートしていないことに注意してください。Javaの最も近い型も64ビットであるため、長くなります。uint64をlongにキャストしても、ビット数は同じであるためデータが失われることはありませんが、大きな値は負の数として表示されます。
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
うーん... 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; でそれをやった ここまでは順調ですね...