2011-06-28 8 views
6

यह कोड है जो विंडोज एसडीके के साथ संकलित करता है:0xFFFFFFFF का उपयोग 32 बिट प्रकार में सभी बिट्स सेट करने के लिए एक विश्वसनीय तरीका है?

UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0); 

जहां DragQueryFileW() में यह हस्ताक्षर है:

UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT); 

और UINT को इस तरह एसडीके शीर्षकों में कहीं परिभाषित किया गया है:

typedef unsigned int UINT; 

मंच जहां int निश्चित रूप से 32-बिट्स है। सामान्य रूप से, UINT जैसे प्रकार सिस्टम गठबंधन पर निश्चित चौड़ाई को स्वतंत्र करने के लिए हैं, इसलिए यदि किसी अन्य प्लेटफ़ॉर्म पर एक ही कोड को फिर से सम्मिलित किया जाना है, जहां DragQueryFileW() को किसी भी तरह से फिर से कार्यान्वित किया गया है, तो यह भी संबंधित typedef होगा जो UINT मानचित्र को चालू करेगा एक उपयुक्त 32-बिट हस्ताक्षरित प्रकार।

अब एक स्थिर विश्लेषण उपकरण है जो 0xFFFFFFFF निरंतर देखता है और शिकायत करता है कि यह एक अयोग्य जादू संख्या और one should use -1 instead है। जबकि निश्चित रूप से -1 अच्छा और पोर्टेबल है, मैं नहीं देख सकता कि 0xFFFFFFFF निरंतर उपयोग करने का तरीका यहां एक समस्या हो सकती है क्योंकि जब भी प्रकार को पोर्ट करना अभी भी 32-बिट होगा और स्थिर ठीक रहेगा।

-1 के बजाय 0xFFFFFFFF का उपयोग कर रहा है ताकि सभी परिदृश्य इस परिदृश्य में सुरक्षित और पोर्टेबल सेट कर सकें?

+1

हो सकता है स्थिर विश्लेषक शिकायत करता है, क्योंकि इसके बारे में 32-बिट या 64-बिट चिंता मत हो सकते हैं। – iammilind

+0

स्थिर विश्लेषण उपकरण में झूठी सकारात्मक की तरह लगता है। यह देखने में सक्षम नहीं हो सकता है कि आप हमेशा 32-बिट संदर्भ में उस स्थिरता का उपयोग कर रहे हैं। –

+4

इसके बजाए '~ 0u' का प्रयोग करें। – ybungalobill

उत्तर

2

0xffffffff निश्चित रूप से सभी बिट्स को 32 बिट्स में सेट करने के लिए एक विश्वसनीय तरीका है। लेकिन मैं हमेशा 32 बिट्स होने पर यूआईएनटी पर निर्भर नहीं रहूंगा।

यह कम "जादू" आप भी यह लिख सकता है बनाने के लिए: (1 < < 32) - 1

+0

मुझे यकीन नहीं है कि स्थानांतरण एक अच्छा विचार है या नहीं। सिद्धांतों के रूप में, हर जगह -1 कार्यों का उपयोग करना, यह 2 के पूरक में 1s की एक अंतहीन धारा है। – DarkDust

12

पोर्टेबल तरह से सभी बिट्स (टाइप के आकार की परवाह किए बिना) को भरने के लिए वास्तव में है:

type variable = (type)-1; 

में के रूप में:

UINT foo = (UINT)-1; 

या अधिक पोर्टेबल का उपयोग कर C99 प्रकार के नाम:

uint32_t foo = (uint32_t)-1; 

सी मानक गारंटी देता है कि -1 बिट्स को सभी बिट्स सेट करता है।

अब, यदि आप गारंटी दे सकते हैं कि आपका चर हस्ताक्षरित 32 बिट्स है तो 0xFFFFFFFF का उपयोग करके ठीक है। लेकिन मैं अभी भी -1 संस्करण के लिए जाऊंगा।

+0

नहीं, यह काम करता है क्योंकि मानक ऐसा करता है। यहां तक ​​कि एक मंच पर भी जो दो पूरक का उपयोग नहीं करता है, कार्यान्वयन को यह काम करने की गारंटी देता है। –

+0

@ ल्यूक डैंटन: आप सही हैं। इस बीच भी पढ़ें और अब इसे सही किया है। – DarkDust

3

0xFFFFFFFF के साथ एक संभावित समस्या यह है कि आप आसानी से एक एफ को याद कर सकते हैं और एक पूर्ण डमी मान में प्रारंभ कर सकते हैं।

मुझे विश्वास है कि यह एक निरंतर परिभाषित करने के लिए बेहतर है:

#define ALL_ONES_32BIT ((UINT) -1) 

और उपयोग करने वाले हर जगह।

4

आप इस्तेमाल कर सकते हैं:

type var = 0; 
var = ~var; 
+0

या सिर्फ 'प्रकार var = ~ 0;' – fredoverflow

+3

@FredOverflow, कि क्या करेंगे? अगर टाइप int से बड़ा है तो क्या होगा? – Chethan

+0

अच्छा बिंदु! .... – fredoverflow

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