abs (-2147483648) का परिणाम -2147483648 है, है ना? यह अस्वीकार्य लगता है।अधिकतम नकारात्मक पूर्णांक -2147483648 का पूर्ण मूल्य अभी भी -2147483648 है?
printf("abs(-2147483648): %d\n", abs(-2147483648));
उत्पादन:
abs(-2147483648): -2147483648
abs (-2147483648) का परिणाम -2147483648 है, है ना? यह अस्वीकार्य लगता है।अधिकतम नकारात्मक पूर्णांक -2147483648 का पूर्ण मूल्य अभी भी -2147483648 है?
printf("abs(-2147483648): %d\n", abs(-2147483648));
उत्पादन:
abs(-2147483648): -2147483648
मानक का कहना है के बारे में abs()
:
abs
,labs
, औरllabs
कार्यों की गणना एक पूर्णांकj
का पूर्ण मूल्य। यदि परिणाम का प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है।
और परिणाम वास्तव में प्रतिनिधित्व नहीं किया जा सकता है क्योंकि हस्ताक्षर किए गए पूर्णांक के 2 का पूरक प्रतिनिधित्व सममित नहीं है। इसके बारे में सोचें ... यदि आपके पास int
में 32 बिट्स हैं, तो आपको 2 INT_MIN
से INT_MAX
से अलग-अलग मान देता है। यह मूल्यों की एक संख्या भी है। इसलिए, यदि केवल एक 0 है, तो 0 से अधिक मानों की संख्या 0 से कम मानों की संख्या के समान नहीं हो सकती है और इसलिए INT_MIN
के INT_MIN
के मूल्य के साथ कोई सकारात्मक समकक्ष नहीं है।
तो, आपके प्लेटफॉर्म पर abs(INT_MIN)
को अस्वीकार्य क्या है।
इस
printf("abs(-2147483648): %u\n", abs(-2147483648));
यह, मेरे दोस्त, ने व्यवहार को अपरिभाषित किया है। आप हस्ताक्षरित फॉर्मेटर के साथ एक हस्ताक्षरित पूर्णांक मुद्रित कर रहे हैं। I -1 क्योंकि इसके अलावा सवाल का जवाब नहीं है। –
2147483648 के बाद से INT_MAX
आपके क्रियान्वयन के तुलना में अधिक है की कोशिश करें, तो abs(-2147483648)
अनिर्धारित रहता है।
यह जीएनयू ग्लिब स्रोत कोड में 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
और? मेरा मतलब है, इसे विस्तृत करें? –
नकारात्मक संख्या आमतौर पर सफेद बाइनरी पूरक का प्रतिनिधित्व किया जाता है।
नकारात्मक करने के लिए सकारात्मक यह प्रयोग किया जाता है परिवर्तित करने के लिए तर्क
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 और न्यूनतम मूल्य हमेशा दो पूरक में अस्वीकार करने के बाद समान होता है –
पर लागू होता है मेरा मानना है कि इस अपरिभाषित व्यवहार है। मेरे पास सी मानक आसान नहीं है, इसलिए मैं इसे वापस नहीं कर सकता। –
आप क्या उम्मीद करते हैं, यह देखते हुए कि 'abs (int) '' int' लौटाता है? –
सी 11 का नवीनतम मसौदा कहता है (7.21.6.1, पेट और दोस्तों के बारे में) "यदि परिणाम का प्रतिनिधित्व नहीं किया जा सकता है, तो व्यवहार को परिभाषित नहीं किया गया है" –