2011-11-04 7 views
15

Come si converte un int unsigned in jint? Devo convertirlo a tutti, o posso semplicemente restituirlo senza alcun trattamento speciale? Questo è fondamentalmente il mio codice in questo momento, ma non posso testarlo, perché non ho installato JNI localmente.JNI: conversione di unsigned int in jint

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

risposta

16

Nel caso generale, jint equivale a int e pertanto può contenere circa la metà dei valori di unsigned int. La conversione funzionerà in silenzio, ma se un valore jint è negativo o se un valore è maggiore del valore massimo che può contenere un jint, il risultato non sarà quello che ti aspetti.

+0

Sto memorizzando solo numeri piccoli, che non supereranno mai i limiti di un jint, quindi dovrebbe andare bene. – Pedro

+0

Possono mai essere negativi? –

+0

@Jonathan Una volta che il valore raggiunge la metà della capacità di un int unsigned, darà un int negativo a causa del modo in cui i tipi vengono implementati; piccoli valori vanno bene – Will03uk

6

jint è un typedef per int32_t si applicano in modo che tutte le solite regole di fusione.

7

A seconda delle impostazioni del compilatore, potrebbe esserci o meno un avviso sul missaggio di interi firmati/non firmati. Non ci saranno errori. Tutti gli avvertimenti delle risposte sopra riportate si applicano - I valori unsigned int di 0x80000000 (2.147.483.648) e superiori finiranno come numeri interi negativi sul lato Java.

Se è imperativo che i grandi numeri sono conservati in Java, utilizzare un jlong come un tipo di dati di ritorno, invece, e convertire in questo modo:

return (jlong)(unsigned long long)i; 

Il punto è quello di espandere primo a 64 bit, quindi per lanciare via senza firma. Farlo viceversa produrrebbe un numero negativo a 64 bit.