2011-11-04 280 views
15

如何将unsigned int转换为jint?我是否必须完全转换它,或者我可以在没有任何特殊处理的情况下返回它吗?这基本上是我的代码,但我无法测试它,因为我没有在本地设置JNI。JNI:将unsigned int转换为jint

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

回答

16

在一般情况下,jint相当于int,因此可以保留大约一半的值unsigned int。转换将无声无息地进行,但如果jint值为负值或unsigned int值大于a jint可容纳的最大值,则结果将不会符合您的预期。

+0

我只存储少量数字,永远不会超过jint的限制,所以它应该没问题。 – Pedro

+0

他们可以负面吗? –

+0

@Jonathan一旦该值达到unsigned int容量的一半,由于类型的实现方式,它将给出一个负值int;小数值很好 – Will03uk

6

jintint32_t一个typedef使所有常见的铸造规则。

7

根据您的编译器设置,可能会也可能不会有混合带符号/无符号整数的警告。不会有错误。上述答案中的所有注意事项适用于-0.值0x80000000(2,147,483,648)及以上将最终成为Java端的负整数。

如果它的当务之急是那些大量在Java中保存,使用jlong为返回的数据类型,而是和转换这样的:

return (jlong)(unsigned long long)i; 

的一点是首先扩大到64位,然后投离开无符号性。反过来做会产生一个64位的负数。

相关问题