2011-12-09 20 views
8

तो मैं सी के लिए नौसिखिया का थोड़ा सा हूं और मुझे यह जानकर उत्सुकता है कि मुझे यह असामान्य व्यवहार क्यों मिल रहा है।सी मेरे हेक्स मानों को गलत तरीके से प्रिंट क्यों करता है?

मैं एक समय में एक फ़ाइल 16 बिट पढ़ रहा हूँ और सिर्फ उन्हें बाहर मुद्रण इस प्रकार है।

#include <stdio.h> 

#define endian(hex) (((hex & 0x00ff) << 8) + ((hex & 0xff00) >> 8)) 

int main(int argc, char *argv[]) 
{ 
    const int SIZE = 2; 
    const int NMEMB = 1; 
    FILE *ifp; //input file pointe 
    FILE *ofp; // output file pointer 

    int i; 
    short hex; 
    for (i = 2; i < argc; i++) 
    { 
    // Reads the header and stores the bits 
    ifp = fopen(argv[i], "r"); 
    if (!ifp) return 1; 
    while (fread(&hex, SIZE, NMEMB, ifp)) 
    { 
     printf("\n%x", hex); 
     printf("\n%x", endian(hex)); // this prints what I expect 
     printf("\n%x", hex); 
     hex = endian(hex); 
     printf("\n%x", hex); 
    } 
    } 
} 

परिणाम कुछ इस तरह दिखाई:

ffffdeca 
cade // expected 
ffffdeca 
ffffcade 
0 
0 // expected 
0 
0 
600 
6 // expected 
600 
6 

क्यों पिछले प्रत्येक ब्लॉक में लाइन दूसरा रूप में एक ही मूल्य प्रिंट नहीं करता किसी को भी मुझे समझा सकते हैं?

उत्तर

10

यह पूर्णांक प्रकार पदोन्नति वजह से है।

आपके shorts को int पर निहित रूप से प्रचारित किया जा रहा है। (जो यहां 32-बिट्स है) तो ये इस मामले में साइन-एक्सटेंशन प्रचार हैं।

इसलिए, आपका printf() पूर्ण 32-बिट int के हेक्साडेसिमल अंकों को प्रिंट कर रहा है।

जब अपने short मान ऋणात्मक है, तो साइन-विस्तार लोगों के साथ शीर्ष 16 बिट भर जाएगा, इस प्रकार आप ffffcade बजाय cade मिलता है।


कारण इस लाइन क्यों:

printf("\n%x", endian(hex)); 

काम करने के लिए लगता है, क्योंकि आपके मैक्रो परोक्ष ऊपरी 16-बिट से छुटकारा हो रही है।

2

आपने हस्ताक्षर किए गए मूल्य के रूप में hex को निहित रूप से घोषित किया है (इसे हस्ताक्षर किए जाने के लिए unsigned short hex) ताकि 0x8FFF पर कोई भी मूल्य नकारात्मक माना जा सके। जब printf इसे 32-बिट int मान के रूप में प्रदर्शित करता है तो यह उन लोगों के साथ साइन-विस्तारित होता है, जिससे अग्रणी Fs होता है। जब आप endian के रिटर्न वैल्यू को प्रिंट करते हैं तो इसे hex पर निर्दिष्ट करके इसे पूर्ण करने के पहले पूर्ण 32 बिट उपलब्ध हैं और सही तरीके से मुद्रित होते हैं।

16

प्रारूप स्ट्रिंग में प्लेसहोल्डर %xunsigned int के रूप में इसी पैरामीटर व्याख्या करता है।

short के रूप में पैरामीटर मुद्रित करने के लिए प्लेसहोल्डर के लिए लंबाई संशोधक h जोड़ें:

printf("%hx", hex); 

http://en.wikipedia.org/wiki/Printf_format_string#Format_placeholders

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

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