2010-05-11 8 views
8

क्या मैं अहस्ताक्षरित numerics (अहस्ताक्षरित छोटा है, पूर्णांक और देशांतर) के बारे में पता है, कि यह सकारात्मक संख्या केवल शामिल हैं, लेकिन निम्नलिखित सरल कार्यक्रम को सफलतापूर्वक एक अहस्ताक्षरित पूर्णांक के लिए एक नकारात्मक संख्या आवंटित:क्यों अहस्ताक्षरित int नकारात्मक संख्या

1 /* 
    2 * ===================================================================================== 
    3 * 
    4 *  Filename: prog4.c 
    5 * 
    6 * ===================================================================================== 
    7 */ 
    8 
    9 #include <stdio.h> 
10 
11 int main(void){ 
12 
13  int v1 =0, v2=0; 
14  unsigned int sum; 
15  
16  v1 = 10; 
17  v2 = 20; 
18  
19  sum = v1 - v2; 
20  
21  printf("The subtraction of %i from %i is %i \n" , v1, v2, sum); 
22  
23  return 0; 
24 } 

उत्पादन होता है: The subtraction of 10 from 20 is -10

+4

इसके अलावा, आपका संदेश भ्रामक है। यह कहना चाहिए "** ** ** से ** ** ** ** का घटाव ..." है जो आप गणना कर रहे हैं। –

+0

मैं ऐसी समस्या के समाधान की तलाश नहीं कर रहा हूं, मैं इसके बारे में विचार समझना चाहता हूं। –

+0

[सी बिना हस्ताक्षर किए गए int को ऋणात्मक मूल्य प्रदान करने का संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/1831753/c-unsigned-int-providing-a-negative-value) –

उत्तर

22

%i एक के लिए फॉर्मेट स्पेसिफायर पूर्णांक पर हस्ताक्षर किए है, एक हस्ताक्षरित पूर्णांक मुद्रित करने के लिए आपको %u का उपयोग करने की आवश्यकता है।

+2

याद रखें, क्योंकि हस्ताक्षरित मान केवल स्टोर कर सकते हैं nonnegative मान, किसी अन्य से एक हस्ताक्षरित पूर्णांक घटाना परिणामस्वरूप एक अंडरफ्लो होगा यदि minuend subtrahend से छोटा है, तो आप एक अंडरफ्लो प्राप्त करने जा रहे हैं। एक नज़र डालें: http://www.topbits.com/integer-overflow.html – LandonSchropp

1

क्योंकि उस राशि में संग्रहित है अहस्ताक्षरित int मान printf %i

8

में हस्ताक्षर किए गए दशमलव पूर्णांक की तरह व्यवहार किया जाता है printf के साथ, %i प्रारूप एक signed int आउटपुट। unsigned int आउटपुट करने के लिए %u का उपयोग करें। सी प्रोग्रामिंग शुरू करते समय यह एक आम मुद्दा है। अपने प्रश्न को हल करने के लिए, v1 - v2 का परिणाम -10 है, लेकिन sum एक unsigned int है, इसलिए वास्तविक उत्तर शायद 42 9 4 9 67286 (2 - 10) जैसा कुछ है। देखें कि जब आप The subtraction of %i from %i is %u \n का उपयोग करते हैं तो आपको क्या मिलता है। :)

6

हस्ताक्षर किए गए int और हस्ताक्षरित int स्मृति में समान आकार हैं, उनके बीच एकमात्र अंतर यह है कि आप उन्हें कैसे छेड़छाड़ करते हैं। हस्ताक्षरित मान एक जुड़वां पूरक प्रतिनिधित्व का उपयोग करते हैं।

यदि आप 4xte स्मृति स्थान में 0xFFFFFFFF डालते हैं, और फिर पूछें कि वहां क्या मूल्य है? खैर अगर हम इसे एक हस्ताक्षरित int के रूप में समझते हैं, तो यह -1 है, लेकिन यदि हम इसे एक हस्ताक्षरित int के रूप में समझते हैं तो मूल्य 42 9 4 9 672 9 5 है। किसी भी तरह से यह एक ही पैटर्न है, अंतर यह है कि आप इसका क्या अर्थ देते हैं।

जब आपने 10 - 20 को एक हस्ताक्षरित int में असाइन किया है, तो आपने -10 (सी ओवरफ्लो या अंडरफ्लो चेकिंग नहीं करता है) का मान लिया है, यह 0xFFFFFFF6 का थोड़ा सा पैटर्न है, जिसका अर्थ है -10 हस्ताक्षरित int में या एक हस्ताक्षरित int में 42 9 4 9 67286। यदि आप एक हस्ताक्षरित int मुद्रित करने के लिए कंपाइलर (% i का उपयोग करके) बताते हैं तो यह हस्ताक्षरित int और प्रिंट -10 के रूप में उस बिट पैटर्न को व्याख्या करता है, यदि आपने एक हस्ताक्षरित int प्रिंट करने के लिए कंपाइलर (% u का उपयोग करके) को बताया है तो यह उस बिट पैटर्न को बिना हस्ताक्षर किए और 42 9 4 9 67286 प्रिंट करता है।

+0

तो, जिस तरह से मैं बिट पैटर्न की व्याख्या करता हूं वह स्मृति में मान को नियंत्रित करता है। धन्यवाद। –

+0

ठीक है, "स्मृति में" मान हमेशा समान होता है। वे एक ही बिट्स हैं। आउटपुट के तरीके में क्या बदलाव है। – Veky