web-dev-qa-db-ja.com

JNI:unsigned intをjintに変換する

Unsigned intをjintに変換するにはどうすればよいですか?変換する必要がありますか、それとも特別な処理をせずに返品することはできますか?これは基本的に今のところ私のコードですが、JNIをローカルでセットアップしていないため、テストできません。

JNIEXPORT jint JNICALL
Java_test_test(JNIEnv* env, jobject obj, jlong ptr)
{
    MyObject* m = (MyObject*) ptr; 
    unsigned int i = m->get(); 
    return i; 
}
19
Pedro

一般的なケースでは、jintintと同等であり、unsigned intの値の約半分を保持できます。変換はサイレントに機能しますが、jint値が負の場合、またはunsigned int値がjintが保持できる最大値より大きい場合、結果は意図したとおりではありません期待しています。

18

jintint32_tのtypedefなので、通常のすべてのキャストルールが適用されます。

10
IronMensan

コンパイラの設定に応じて、符号付き/符号なし整数の混合に関する警告がある場合とない場合があります。エラーはありません。上記の回答からのすべての警告が適用されます-unsigned int 0x80000000(2,147,483,648)以上の値は、Java側で負の整数になります。

これらの大きな数値をJavaで保持することが不可欠な場合は、代わりにjlongを戻りデータ型として使用し、次のように変換します。

return (jlong)(unsigned long long)i;

ポイントは、最初に64ビットに拡張し、次に符号なしをキャストすることです。逆にすると、64ビットの負の数が生成されます。

8
Seva Alekseyev