java - ejemplos - tipos de datos primitivos en programacion
JNI: convertir int sin signo a jint (3)
¿Cómo convierto un int sin firmar a jint? ¿Tengo que convertirlo o puedo devolverlo sin ningún tratamiento especial? Este es básicamente mi código en este momento, pero no puedo probarlo, ya que no he configurado JNI localmente.
JNIEXPORT jint JNICALL
Java_test_test(JNIEnv* env, jobject obj, jlong ptr)
{
MyObject* m = (MyObject*) ptr;
unsigned int i = m->get();
return i;
}
Dependiendo de la configuración de su compilador, puede o no haber una advertencia sobre la mezcla de enteros con signo / sin signo. No habrá error. Se aplican todas las advertencias de las respuestas anteriores: los valores unsigned int
de 0x80000000 (2,147,483,648) y superiores terminarán como enteros negativos en el lado de Java.
Si es imperativo que esos números grandes se conserven en Java, use un jlong
como un tipo de datos de retorno en su lugar, y jlong
esta manera:
return (jlong)(unsigned long long)i;
El punto es expandir primero a 64 bits, luego desechar sin firmar. Hacerlo al revés produciría un número negativo de 64 bits.
En el caso general, jint
es equivalente a int
, por lo que puede contener aproximadamente la mitad de los valores de unsigned int
. La conversión funcionará de forma silenciosa, pero si un valor jint
es negativo o si un valor unsigned int
es mayor que el valor máximo que puede contener un jint
, el resultado no será el que esperaba.
jint
es un typedef para int32_t
por lo que se int32_t
todas las reglas de conversión habituales.