2012-09-19 17 views
7

मैं निम्नलिखित सी कोड लिखा है:सी हेक्स लगातार प्रकार

#include <stdio.h> 

int main() { 
    printf("%d\n", -1 >> 8); 
    return 0; 
} 

मैं अपने x86_64 -m32 ध्वज का उपयोग पर जीसीसी 4.6.3 के साथ इस कोड को संकलित। मुझे -1 मुद्रित आउट मिलता है जैसा कि मैं उम्मीद करता हूं, शिफ्ट अंकगणित रूप से दो के पूरक प्रतिनिधित्व का उपयोग करके होता है जिसके परिणामस्वरूप -1 होता है।

अब अगर मैं बजाय

printf("%d\n", 0xFFFFFFFF >> 8); 

बारे में मैं 16777215. मिल रहा अंकगणित जो में परिणाम होगा -1 फिर से होने की यह लगातार एक पूर्णांक (हस्ताक्षरित) के रूप में व्याख्या की जा करने के लिए और फिर पारी की उम्मीद होगी। मैंने नवीनतम सी मानक को देखा है और मुझे समझ में नहीं आता कि यह मामला क्यों है। कोई विचार?

+0

यह बीच हस्ताक्षरित (-1) और अहस्ताक्षरित (0xFFFFFFFF) – SpacedMonkey

+0

@SpacedMonkey मैं पूछ रहा हूँ क्यों 0xFFFFFFFF – dschatz

+0

@SpacedMonkey Btw अहस्ताक्षरित है, '-' इस अंतर के लिए योगदान नहीं है अंतर है। '-' अभी भी एक यूनरी ऑपरेटर है और यह कुछ हस्ताक्षर नहीं करता है। यह '1' है जिस पर हस्ताक्षर किया गया है (और इसलिए' -1' भी हस्ताक्षरित है), जबकि '0xFFFFFFFF' हस्ताक्षरित है। –

उत्तर

10

C99 मानक (6.4.4.1) के अनुसार, हेक्साडेसिमल स्थिरांक इस सूची में पहले प्रकार है कि उन्हें प्रतिनिधित्व कर सकते हैं होगा:

int 
unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

हेक्स शाब्दिक 0xFFFFFFFF एक int में फिट नहीं करता है (जो कर सकते हैं -0x80000000 से 0x7FFFFFFF पर मान रखें), लेकिन unsigned int में फिट है, और इसलिए इसका प्रकार हस्ताक्षरित नहीं होगा। 8 द्वारा हस्ताक्षरित मूल्य 0xFFFFFFFF को दाएं स्थानांतरित करने से 16777215 देता है।

+0

में समान है क्यों 0xFFFFFFFF int में फिट नहीं है? – dschatz

+0

@dschatz: क्योंकि यह 42 9 4 9 672 9 5 है, और आपका 'int' केवल 2147483647 तक जा सकता है। –

+0

@dschatz: मैंने अभी जोड़ने के लिए संपादित किया है - क्योंकि यह 0x7fffffff से अधिक है जो 32-बिट int द्वारा 2 के पूरक का उपयोग करके सबसे बड़ा मान है प्रतिनिधित्व। – interjay

10

असज्जित अभिन्न शाब्दिक अलग प्रकार का है कि क्या वे (सी ++ 11 में सी 11 में 6.4.4.1/5, टेबल 6) दशमलव या नहीं कर रहे हैं पर निर्भर करता है:

  • दशमलव शाब्दिक, यानी [1-9][0-9]*, कर रहे हैं हमेशा हस्ताक्षर किए।

  • हेक्साडेसिमल और ऑक्टल अक्षरों या तो हस्ताक्षरित या हस्ताक्षरित हैं। यदि मान एक हस्ताक्षरित प्रकार के लिए बड़ा है, लेकिन समान चौड़ाई के हस्ताक्षरित प्रकार को फिट करने के लिए पर्याप्त छोटा है, तो यह हस्ताक्षरित नहीं होगा। (यह है कि आपके हेक्स लगातार करने के लिए होता है।)

राइट-स्थानांतरण नकारात्मक पूर्णांक कार्यान्वयन से परिभाषित है, और आप साइन-विस्तार पाने के लिए होता है। हस्ताक्षरित मूल्य को सही स्थानांतरित करना सरल विभाजन है।

+0

सी मानक ड्राफ्ट मैंने यहां पाया http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf दिखाता है कि हेक्स स्थिरांक पृष्ठ 64 पर हस्ताक्षरित इंक से पहले इनट हैं। मुझे क्या याद आ रही है ? – dschatz

+1

आपने जो कहा वह सी 99 मानक (6.4.4.1/5) से मेल नहीं खाता है। उस दशमलव स्थिरांक के अनुसार हस्ताक्षरित हैं और हेक्स/ऑक्टल हस्ताक्षरित या हस्ताक्षरित हो सकते हैं। – interjay

+1

@dschatz: ओह, मुझे यह गलत रास्ता मिल गया। मुझे ठीक करने दो! यह वास्तव में सी ++ और सी –

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