2017-04-24 29 views
5

मुझे नीचे 2 कोड स्निपेट से कोई संदेह है।मानों की तुलना करते समय डेटा ओवरफ़्लो

मैंने 64-बिट मशीन (x86_64-linux-gnu) पर यह कोड चलाया। जब डेटा प्रकार unsigned integer होता है तो मैं मान Val ओवरफ़्लो देख सकता हूं।

#include<stdio.h> 
main() 
{ 
    unsigned int Val = 0xFFFFFFFF-15, Val2 = 0xFFFFFFFF; 
    if (Val+16 < Val2) 
    { 
     printf("Val is less than Val2\n"); 
    } 
} 

डेटा प्रकार है unsigned char यह अतिप्रवाह नहीं करता है।

  1. मूल्य उच्च डेटा प्रकार के लिए प्रोत्साहित करने के Val करता है जब डेटा प्रकार अहस्ताक्षरित चार है:

    #include<stdio.h> 
    main() 
    { 
        unsigned char Val = 0xFF-15, Val2 = 0xFF; 
        if (Val+16 < Val2) 
        { 
         printf("Val is less than Val2\n"); 
        } 
    } 
    

    मैं दो प्रश्न हैं?

  2. यदि हां, तो इसे 32-बिट से 64-बिट unsigned long तक क्यों प्रचारित नहीं किया गया?
+8

यह 90 का नहीं है - आजकल 'मुख्य' पर एक वापसी प्रकार आवश्यक है। – InternetAussie

+0

अंकगणित करते समय, अगर फिट हो सकता है, तो सब कुछ 'int' को बढ़ावा दिया जा सकता है, या' हस्ताक्षर किए गए int 'के लिए नहीं किया जा सकता है। इन प्रकारों का आकार आपके कंपाइलर के लिए विशिष्ट है और आप इसे आसानी से ढूंढ सकते हैं। –

उत्तर

6

C11 मानक कहते हैं निम्नलिखित (सी 11 6.3.11p2.2):

एक int मूल प्रकार के सभी मूल्यों (के रूप में एक के लिए, चौड़ाई द्वारा प्रतिबंधित प्रतिनिधित्व कर सकते हैं बिट-फील्ड), मान को int में परिवर्तित कर दिया गया है; अन्यथा, इसे unsigned int में परिवर्तित कर दिया गया है। इन्हें पूर्णांक प्रचार कहा जाता है। अन्य सभी प्रकार पूर्णांक प्रचार द्वारा अपरिवर्तित हैं।

इस प्रकार:

  1. unsigned char पदोन्नत किया जाएगा - लेकिन यह एक कार्यान्वयन विस्तार intunsigned char के सभी मूल्यों का प्रतिनिधित्व कर सकते हैं कि है - तो यह उन प्लेटफार्मों पर एक unsigned int के लिए प्रोत्साहित किया जा सकता है। आपका प्लेटफ़ॉर्म में से एक नहीं है, इस प्रकार आपकी दूसरी तुलना (int)Val + 16 < (int)Val2 है।

  2. उद्धृत अनुच्छेद की अंतिम वाक्य के अनुसार, unsigned int को कभी भी प्रचारित नहीं किया जाता है। चूंकि अंकगणित पहले खंड में हस्ताक्षरित इनट्स पर किया जाता है, इसलिए 0xFFFFFFFF - 15 + 16 का परिणाम 32-मूल्य-बिट हस्ताक्षरित int वाले कंप्यूटर पर 0U है।

2

हां, दूसरे मामले में संख्या int पर पदोन्नत की जाती है। यदि आप अपना कोड इस प्रकार संशोधित करते हैं:

#include<stdio.h> 
int main() 
{ 
    unsigned char Val = 0xFF-15, Val2 = 0xFF; 
    if ((unsigned char)(Val+16) < Val2) 
    { 
     printf("Val is less than Val2\n"); 
    } 
} 

आपको वह व्यवहार मिलेगा जो आप उम्मीद करते हैं।

+0

आप सभी को धन्यवाद। यह अब बहुत स्पष्ट है। –

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