2011-11-04 11 views
15

Jak przekonwertować unsigned int do jint? Czy muszę w ogóle to przekonwertować, czy mogę po prostu zwrócić to bez specjalnego traktowania? Zasadniczo jest to teraz mój kod, ale nie mogę go przetestować, ponieważ nie ustawiłem lokalnie JNI.JNI: konwersja unsigned int do jint

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

Odpowiedz

16

W ogólnym przypadku jint jest odpowiednikiem , więc może zawierać około połowy wartości unsigned int. Konwersja będzie działać cicho, ale jeśli wartość jint jest ujemna lub jeśli wartość unsigned int jest większa niż maksymalna wartość, jaką może pomieścić jint, wynik nie będzie taki, jak się spodziewasz.

+0

Przechowuję tylko małe liczby, które nigdy nie przekroczą limitów, więc powinno być dobrze. – Pedro

+0

Czy mogą kiedykolwiek być negatywne? –

+0

@ Jonathan Gdy wartość osiągnie połowę pojemności niepodpisanego int, da to wartość ujemną ze względu na sposób implementacji typów; małe wartości są w porządku – Will03uk

6

jint jest typedef dla int32_t stosuje więc wszystkie zwykłe zasady odlewania.

7

W zależności od ustawień kompilatora może być lub nie być ostrzeżeniem na temat mieszania liczb całkowitych ze znakiem/bez znaku. Nie będzie błędu. Wszystkie zastrzeżenia z powyższych odpowiedzi dotyczą - unsigned int wartości 0x80000000 (2 147 483 648) i powyżej będą kończyć się jako ujemne liczby całkowite po stronie Java.

Jeśli jest to konieczne, że te duże cyfry są zachowane w języku Java, użyj jlong jako typ danych powrotnej zamiast, i przekształcić tak:

return (jlong)(unsigned long long)i; 

Chodzi o to, aby najpierw rozbudować do 64 bitów, a następnie rzucić z dala od nie podpisanej. Wykonanie go na odwrót spowoduje wygenerowanie 64-bitowej liczby ujemnej.