0

私は JNI コードを書いていて、uint64_t を jlong​​ に変換する必要がある状況に遭遇しました。uint64_t を jlong​​ に変換する現在の方法は次のとおりです。

jlong uint64_t_to_jlong (uint64_t value) {
  if (value > std::numeric_limits<jlong>::max()) {
    return std::numeric_limits<jlong>::max(); 
  }
  return static_cast<jlong>(value);
}

そして、これは明らかに完璧なアプローチではありませんvalue > std::numeric_limits<jlong>::max()。ただし、Java 側では負の値が返されるため、直接返すstatic_cast<jlong>(value)のも良い方法ではないように思えます。

すべてのケースをスムーズかつ正しく処理できるより良いアプローチがあるかどうかを知ることはできますか?

4

1 に答える 1

0

Louis のコメントで示唆されているように、Java 8 でそれを処理する 1 つの方法は、C++ 側で単純にキャストuint64_tし、必要な操作を行うために、Long.compareUnsigned()jlongなどの Java 8 によって提供される署名なし操作のセットを使用することです。

public static int compareUnsigned(long x, long y)
Compares two long values numerically treating the values as unsigned.

Java 8 が使用されていない場合、Google Guava の署名されていないライブラリでもこれを実現できます。

于 2014-11-17T20:00:27.023 に答える