2011-11-04 29 views
15

कनवर्ट करना मैं एक हस्ताक्षरित int को जिंट में कैसे परिवर्तित करूं? क्या मुझे इसे बिल्कुल परिवर्तित करना है, या क्या मैं इसे किसी विशेष उपचार के बिना वापस कर सकता हूं? यह मूल रूप से मेरा कोड है, लेकिन मैं इसका परीक्षण नहीं कर सकता, क्योंकि मैंने स्थानीय रूप से जेएनआई सेट नहीं किया है।जेएनआई: बिना हस्ताक्षर किए गए int को जिंट

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

उत्तर

16

सामान्य स्थिति में, jintint के बराबर है, और इसलिए unsigned int के बारे में आधे मान हो सकते हैं। रूपांतरण चुपचाप काम करेगा, लेकिन यदि jint मान ऋणात्मक है या unsigned int मान jint अधिकतम मूल्य से बड़ा है, तो परिणाम आप अपेक्षा नहीं करेंगे।

+0

मैं केवल छोटी संख्या संग्रहित कर रहा हूं, जो कभी भी जिंट की सीमाओं से अधिक नहीं होगा, इसलिए यह ठीक होना चाहिए। – Pedro

+0

क्या वे कभी नकारात्मक हो सकते हैं? –

+0

@ जोनाथन एक बार मूल्य एक हस्ताक्षरित int की आधा क्षमता तक पहुंच जाता है, यह प्रकारों को लागू करने के तरीके के कारण नकारात्मक अंतर देगा; छोटे मूल्य ठीक हैं – Will03uk

6

jintint32_t के लिए एक typedef तो सभी सामान्य कास्टिंग नियम लागू होते हैं है।

7

आपकी कंपाइलर सेटिंग्स के आधार पर, हस्ताक्षरित/हस्ताक्षरित पूर्णांक मिश्रण के बारे में चेतावनी हो सकती है या नहीं भी हो सकती है। कोई त्रुटि नहीं होगी। उपर्युक्त उत्तरों से सभी चेतावनियां लागू होती हैं - 0x0x80000000 (2,147,483,648) और ऊपर के मान जावा पक्ष पर नकारात्मक पूर्णांक के रूप में समाप्त हो जाएंगे।

तो यह जरूरी है कि उन बड़ी संख्या जावा में संरक्षित कर रहे हैं, बजाय एक वापसी डेटाप्रकार के रूप में एक jlong उपयोग करें, और इस तरह परिवर्तित:

return (jlong)(unsigned long long)i; 

बिंदु पहले, 64 बिट्स के लिए विस्तार करने के लिए तो कास्ट करने के लिए है दूर हस्ताक्षर नस्ल। इसे दूसरी तरफ करने से 64-बिट नकारात्मक संख्या उत्पन्न होगी।