2016-07-17 9 views
6

मैं इस प्रश्न पर आया था।इस सी कोड का आउटपुट "नहीं" क्यों है?

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    unsigned int i = 23; 
    signed char c = -23; 

    if (i > c) 
     printf("yes"); 
    else 
     printf("no"); 

    return 0; 
} 

मुझे समझ में असमर्थ हूँ क्यों इस कोड के उत्पादन में no है।

क्या कोई यह समझने में मेरी सहायता कर सकता है कि तुलनात्मक ऑपरेटर कैसे काम करता है जब तुलना int और char के बीच तुलना में किया जाता है?

+4

पढ़ें [दो के पूरक] (https://en.wikipedia.org/wiki/Two%27s_complement)। और [सी में निहित रूपांतरण] (http: //en.cppreference।कॉम/डब्ल्यू/सी/भाषा/रूपांतरण) (विशेष रूप से [अंकगणितीय रूपांतरण] के बारे में (http://en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions))। –

+0

कैनोनिकल स्रोत [सी मानक] है (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) (यह एन 1570 ड्राफ्ट है)। * पूर्णांक पदोन्नति * के लिए 6.3.1.1 देखें (जो 'हस्ताक्षरित char' मान को 'int' में परिवर्तित करता है), और सामान्य अंकगणितीय रूपांतरणों के लिए 6.3.1.8 * (जो दोनों ऑपरेटरों को एक सामान्य प्रकार में परिवर्तित करता है,' हस्ताक्षरित int ' तुलना करने से पहले)। –

उत्तर

11

आप unsigned int की तुलना signed char से कर रहे हैं। इस तरह की तुलना के अर्थशास्त्र प्रति-अंतर्ज्ञानी हैं: signed और unsigned ऑपरेटरों से जुड़े अधिकांश द्विआधारी संचालन हस्ताक्षरित मूल्य को बिना हस्ताक्षर किए जाने के बाद, हस्ताक्षरित किए गए ऑपरेटरों पर निष्पादित किए जाते हैं (यदि दोनों ऑपरेटरों के प्रचार के बाद समान आकार होता है)।

  • signed char मूल्य एक ही मूल्य -23 के साथ एक int के लिए प्रोत्साहित किया जाता है: ये कदम उठाएँ।
  • तुलना int और unsigned int पर तुलना की जानी है, सामान्य मानक unsigned int सी मानक में परिभाषित किया गया है।
  • intunsigned int में UINT_MAX - 23 के साथ एक बहुत बड़ी संख्या में परिवर्तित किया गया है।
  • तुलना unsigned int मानों पर किया जाता है: 23 छोटा मूल्य है, तुलना झूठी का मूल्यांकन करती है।
  • else शाखा का मूल्यांकन किया गया है, no मुद्रित है।

मामले को बदतर बनाने के लिए, अगर c एक long के रूप में परिभाषित किया गया था, परिणाम long और int एक ही आकार के हों या न हों पर निर्भर होता है। विंडोज़ पर, यह no प्रिंट करेगा, जबकि 64 बिट लिनक्स पर, यह yes प्रिंट करेगा।

तुलना में हस्ताक्षरित और हस्ताक्षरित मानों को कभी भी मिश्रण न करें। इस प्रकार की गलती को रोकने के लिए कंपाइलर चेतावनियां सक्षम करें (-Wall या -Weverything)। आप इस तरह के दुर्भाग्यपूर्ण कोड से पूरी तरह से बचने के लिए -Werror के साथ इन सभी चेतावनियों को घातक बना सकते हैं।

  • पूर्णांक प्रोन्नति में 6.3.1.1 बूलियन, वर्ण, और पूर्णांकों समझाए गए हैं:

    एक पूर्ण संदर्भ के लिए, 6.3 रूपांतरण के तहत सी मानक (सी 11) के निम्न अनुभाग पढ़ ।

  • ऑपरेंड रूपांतरण6.3.1.8 में विस्तृत हैं अंकगणितीय रूपांतरण

आप कार्य समूह की वेबसाइट से C11 स्टैंडर्ड के नवीनतम मसौदे डाउनलोड कर सकते हैं: के बारे में http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

+0

इस उत्तर के पूरक के रूप में उपयोगी संदर्भ: https://www.securecoding.cert.org/confluence/display/c/INT02-C.+Understand+integer+conversion+rules – chrphb

+0

और 6.3.1.1 * पूर्णांक प्रचार के लिए *। [यहां एक लिंक है] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) सी 11 मानक के एन 1570 ड्राफ्ट में। –

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