2008-09-14 17 views
8

मिलान नहीं तुलना अगर मैं है:सी चर और स्थिरांक मान

signed char * p; 

और मैं एक तुलना करते हैं:

if (*p == 0xFF) 
    break; 

यह 0xFF पकड़ने कभी नहीं होगा, लेकिन अगर मैं इसके साथ की जगह -1 यह होगा:

if (*p == (signed char)0xFF) 
    break; 

यह कैसे हो सकता है? क्या यह चिन्ह ध्वज के साथ कुछ है? हालांकि मैं 0xFF == -1 == 255

उत्तर

29

मूल्य 0xFF एक हस्ताक्षरित int मान है। जब तुलना कर सी एक int को *p को बढ़ावा देंगे, इसलिए पहले अगर बयान के बराबर है: जो निश्चित रूप से गलत है

if(-1 == 255) break; 

if(-1 == -1) break; 

जो काम करता है के रूप में आप उम्मीद: (signed char)0xFF का उपयोग करके बयान के बराबर है। यहां मुख्य बिंदु यह है कि signed char प्रकारों की बजाय तुलना int प्रकारों के साथ की जाती है।

+0

0xFF हस्ताक्षरित किया गया है, अहस्ताक्षरित नहीं। 0xFFU हस्ताक्षरित संस्करण है। केवल * पी को बढ़ावा देने की जरूरत है। – Niall

+0

निएल: आप काफी सही हैं; मैं जवाब अपडेट करूंगा। –

2

इसके बाद से 0xFF अभी भी, एक पूर्णांक माना जाता है अपने चार जिसका अर्थ है 127 करने के लिए -128 है, लेकिन अभी भी 0xFF 255

दूसरे मामले में है पहले की तुलना के लिए किसी पूर्णांक पर डाले अपने यह कह रही है कि 0xFF वास्तव में एक हस्ताक्षरित char है, int

4

इंटीजर अक्षरों ने int प्रकार पर हस्ताक्षर किए हैं। चूंकि 0xFF एक हस्ताक्षरित int है, इसलिए संकलक * पी को एक हस्ताक्षरित int में परिवर्तित करता है और फिर तुलना करता है।

जब * पी -1 है, जिसे तब एक हस्ताक्षरित चार से हस्ताक्षरित int में परिवर्तित किया जाता है, यह अभी भी -1 है जिसमें 0xFFFFFFFF का प्रतिनिधित्व होता है, जो 0xFF के बराबर नहीं है।

1

0xff 255 के मान के साथ एक पूर्णांक स्थिरांक के रूप में देखा जाएगा। आपको हमेशा विभिन्न प्रकारों के बीच इस तरह की तुलना पर ध्यान देना चाहिए। आप यह सुनिश्चित करें कि संकलक सही कोड उत्पन्न होगा होना चाहते हैं, तो आप समान किरदार का उपयोग करना चाहिए:

 
if(*p == (signed char)0xFF) break; 

वैसे भी, सावधान रहना कि अगले बयान होगा नहीं काम उसी तरह:

 
if((int)*p == 0xFF) break; 

इसके अलावा, शायद यह एक बेहतर विचार पर हस्ताक्षर किए वर्ण से बचने के लिए हो सकता है, या, यह आप पर हस्ताक्षर किए वर्ण का उपयोग करना चाहिए उन्हें ऐसे -1 इस मामले में के रूप में हस्ताक्षर किए मूल्यों के साथ तुलना करने के लिए:

 
if(*p == -1) break; 

0xff == - 1 केवल तभी उन मूल्यों को कुछ चार (या अहस्ताक्षरित चार) को निर्दिष्ट किया जाएगा चर:

 
char a=0xff; 
char b=-1; 
if(a==b) break; 
संबंधित मुद्दे