2010-04-03 11 views
5

मैं कोड है:एक आकार_टी से एक हस्ताक्षरित int में कनवर्ट करने से मुझे चेतावनी क्यों मिलती है?

unsigned int length = strlen(somestring); 

मैं पर 4 चेतावनी स्तर के साथ संकलन कर रहा हूँ, और यह मुझे बता रहा है कि "size_t से unsigned int करने के लिए रूपांतरण, डेटा की संभावित हानि" जब एक size_t एक के लिए एक typedef है unsigned int

क्यों !?

संपादित करें:

मैं सिर्फ अपने ही समस्या हल हो। मैं एक एक्सपी उपयोगकर्ता हूं, और मेरा कंपाइलर 64 बिट संगतता की जांच कर रहा था। चूंकि size_t प्लेटफॉर्म पर निर्भर है, 64 बिट के लिए यह unsigned long long होगा, जहां यह unsigned int जैसा नहीं है।

+1

सभी आकार निर्भर हैं। 'size_t' को किसी अन्य प्रकार के बराबर नहीं होना चाहिए, वे सभी अलग-अलग हो सकते हैं। आपके पास एकमात्र गारंटी है कि 'आकार (char) == 1', और' char' (जो भी निर्भर है!) में बिट्स की संख्या हैडर 'CHAR_BIT' में शीर्षलेख' 'में परिभाषित किया गया है, और वह 'आकार (छोटा)> = आकार (चार) ',' आकार (int)> = आकार (लंबा)', और 'आकार (लंबा लंबा)> = आकार (लंबा) '। – GManNickG

+0

@GMan: वास्तव में मुझे विश्वास है कि 'आकार (लंबा)> = आकार (int) ':) +1 हालांकि –

+0

@ बिली: ओह डांट। अब ठीक करने में बहुत देर हो चुकी है। -_- ओह अच्छा। : 3 – GManNickG

उत्तर

8

क्योंकि unsigned intsize_t से आपकी मशीन पर एक संक्षिप्त प्रकार है। सबसे अधिक संभावना size_t 64 बिट चौड़ा है, जबकि unsigned int 32 बिट चौड़ा है।

संपादित करें: size_t हस्ताक्षरित int के लिए टाइप टाइप नहीं है।

+0

ठीक है, 'size_t' _is_ कुछ सिस्टम पर' हस्ताक्षरित 'के लिए टाइप किया गया है। हालांकि यह एलपी 64 और एलएलपी 64 सिस्टम पर नहीं होगा। :-) –

+0

@ जेम्स मैकनेलिस: शायद, लेकिन मानक इसे इस तरह परिभाषित नहीं करता है :) –

संबंधित मुद्दे