2012-06-28 36 views
19

abs (-2147483648) का परिणाम -2147483648 है, है ना? यह अस्वीकार्य लगता है।अधिकतम नकारात्मक पूर्णांक -2147483648 का पूर्ण मूल्य अभी भी -2147483648 है?

printf("abs(-2147483648): %d\n", abs(-2147483648)); 

उत्पादन:

abs(-2147483648): -2147483648 
+1

पर लागू होता है मेरा मानना ​​है कि इस अपरिभाषित व्यवहार है। मेरे पास सी मानक आसान नहीं है, इसलिए मैं इसे वापस नहीं कर सकता। –

+5

आप क्या उम्मीद करते हैं, यह देखते हुए कि 'abs (int) '' int' लौटाता है? –

+7

सी 11 का नवीनतम मसौदा कहता है (7.21.6.1, पेट और दोस्तों के बारे में) "यदि परिणाम का प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार को परिभाषित नहीं किया गया है" –

उत्तर

18

मानक का कहना है के बारे में abs():

abs, labs, और llabs कार्यों की गणना एक पूर्णांक j का पूर्ण मूल्य। यदि परिणाम का प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है।

और परिणाम वास्तव में प्रतिनिधित्व नहीं किया जा सकता है क्योंकि हस्ताक्षर किए गए पूर्णांक के 2 का पूरक प्रतिनिधित्व सममित नहीं है। इसके बारे में सोचें ... यदि आपके पास int में 32 बिट्स हैं, तो आपको 2 INT_MIN से INT_MAX से अलग-अलग मान देता है। यह मूल्यों की एक संख्या भी है। इसलिए, यदि केवल एक 0 है, तो 0 से अधिक मानों की संख्या 0 से कम मानों की संख्या के समान नहीं हो सकती है और इसलिए INT_MIN के INT_MIN के मूल्य के साथ कोई सकारात्मक समकक्ष नहीं है।

तो, आपके प्लेटफॉर्म पर abs(INT_MIN) को अस्वीकार्य क्या है।

-5

इस

printf("abs(-2147483648): %u\n", abs(-2147483648)); 
+5

यह, मेरे दोस्त, ने व्यवहार को अपरिभाषित किया है। आप हस्ताक्षरित फॉर्मेटर के साथ एक हस्ताक्षरित पूर्णांक मुद्रित कर रहे हैं। I -1 क्योंकि इसके अलावा सवाल का जवाब नहीं है। –

10

2147483648 के बाद से INT_MAX आपके क्रियान्वयन के तुलना में अधिक है की कोशिश करें, तो abs(-2147483648) अनिर्धारित रहता है।

5

यह जीएनयू ग्लिब स्रोत कोड में abs.c में कोड है।

/* Return the absolute value of I. */ 
int 
DEFUN(abs, (i), int i) 
{ 
    return(i < 0 ? -i : i); 
} 

तो, abs (-2147483648) वापसी - (- 2147483648)। 86 में, यह इस दो अनुदेश

movl $-2147483648, %eax 
negl %eax 

negl अनुदेश इस तरह से कार्यान्वित किया जाता है द्वारा लागू है: num = 0-संख्या; एसबीबी इस तरह से लागू किया गया है: गंतव्य से स्रोत को घटाता है, और कैरी फ्लैग सेट होने पर 1 अतिरिक्त घटा देता है। तो abs (-2147483648) (हेक्स 0x80000000) -> - (- 2147483648) -> 0 - (- 2147483648) अंत में (0x80000000) बन जाता है। negl शिक्षा का

विवरण, कृपया यात्रा http://zsmith.co/intel_n.html#neg

SBB शिक्षा का विवरण, कृपया देखें http://web.itu.edu.tr/kesgin/mul06/intel/instr/sbb.html

+0

और? मेरा मतलब है, इसे विस्तृत करें? –

9

नकारात्मक संख्या आमतौर पर सफेद बाइनरी पूरक का प्रतिनिधित्व किया जाता है।

नकारात्मक करने के लिए सकारात्मक यह प्रयोग किया जाता है परिवर्तित करने के लिए तर्क

x -> not(x)+1 

के लिए 8 बिट अंकगणितीय

01111111b 127 और -127
10000000b + 1 = 10000001b

और विपरीत दिशा करने के लिए हो जाता है -127 10000001b
01111110b + 1 = 01111111b

-128 के बारे में क्या?

-128 10000000b है और इसमें कोई सकारात्मक समकक्ष नहीं है, क्योंकि अंकगणित पर हस्ताक्षर किए गए 8 बिट्स में कोई 128 नहीं है।

10000000 -> 01,111,111 + 1 = 10000000 और -128 फिर

एक ही मूल प्रश्न

+0

यही कारण है कि 0 और न्यूनतम मूल्य हमेशा दो पूरक में अस्वीकार करने के बाद समान होता है –