2010-01-20 15 views
6

हेक्स के लिए scanf, प्रत्येक संख्या में टाइप का उपयोग फ्लोट करने के लिए, मैं बाहर प्रिंट दो पंक्तियों के लिए अपने कार्यक्रम चाहते हैं: उदाहरण के लिएपरिवर्तित पूर्णांक

byte order: little-endian 

> 2 
    2 0x00000002 
    2.00 0x40000000 

> -2 
    -2 0xFFFFFFFE 
-2.00 0xC0000000 

मैं इसे हेक्स में बाहर 2 मुद्रित करने के लिए प्राप्त कर सकते हैं लेकिन मुझे एक फ्लोट की आवश्यकता है और निश्चित रूप से मैं स्कैनफ को के रूप में स्कैन करने की आवश्यकता नहीं है जब मुझे int

पर स्कैन करने की आवश्यकता है यदि मैं प्रिंट करने की कोशिश करता हूं तो मुझे फ्लोट के रूप में डाला जाता है, मुझे शून्य मिलता है। अगर मैं फ्लोट के रूप में स्कैन करता हूं तो मुझे सही आउटपुट मिलता है। मैंने int को फ्लोट में कनवर्ट करने का प्रयास किया है लेकिन यह अभी भी शून्य के रूप में आता है।

यहाँ मेरी उत्पादन अब तक

Int - float - hex 

byte order: little-endian 

>2 

     2 0x000002 
     2.00 00000000 

ऐसा लगता है कि मैं एक नाव ठीक क्यों अभ्यस्त यह एक हेक्स के रूप में मुद्रित करने के लिए परिवर्तित कर रहा हूँ? यदि मैं एक फ्लोट के रूप में स्कैन करता हूं तो मुझे पहले उदाहरण की तरह सही हेक्स प्रतिनिधित्व मिलता है। यह कुछ आसान होना चाहिए। मैं एक दशमलव के रूप में स्कैन करने के लिए की आवश्यकता है मन में रखना मैं cygwin में यह चल रहा

यहाँ

मैं अब तक है ..

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 


int HexNumber; 
    float convert; 
printf("Int - float - hex\n"); 



int a = 0x12345678; 
unsigned char *c = (unsigned char*)(&a); 
if (*c == 0x78) 
{ 
    printf("\nbyte order: little-endian\n"); 
} 
else 
{ 
    printf("\nbyte order: big-endian\n"); 
} 

printf("\n>"); 
scanf("%d", &HexNumber); 
printf("\n%10d ",HexNumber); 
printf("%#08x",HexNumber); 





convert = (float)HexNumber; // converts but prints a zero 

printf("\n%10.2f ", convert); 
printf("%#08x", convert); // prints zeros 


return 0; 
} 
+0

क्या आप हमें कुछ कोड दिखा सकते हैं? –

+0

क्षमा करें। इसके पोस्ट – Steller

+0

इनपुट के रूप में 1 दर्ज करते समय मेरे लिए शून्य प्रिंट नहीं करता है। आप क्या हासिल करने का प्रयास कर रहे हैं? आपका इनपुट नंबर क्या है? –

उत्तर

8

में भेजा जाता है में एक अहस्ताक्षरित सूचक dereferencing है इस प्रयास करें:

int i = 2; 
float f = (float)i; 
printf("%#08X", *((int*) &f)); 

[संपादित करें]

@Corey:

आइए इसे अंदर से पार्स करें:

& f = address of f = say address 0x5ca1ab1e 
(int*) &f = interpret the address 0x5ca1ab1e as integer pointer 
* ((int*)&f) = get the integer at address 0x5ca1ab1e 

निम्नलिखित अधिक संक्षिप्त है, लेकिन यह सी भाषा के ऑपरेटर संबद्धता और ऑपरेटर पूर्वता याद करना मुश्किल है (मैं कुछ जोड़ा कोष्टक के अतिरिक्त स्पष्टता पसंद करते हैं और रिक्त स्थान को प्रदान करता है):,

printf("%#08X", *(int*)&f); 
+0

ऐसा लगता है कि मैंने एक ही समय में एक ही चीज़ को शामिल करने के लिए अपना उत्तर संपादित किया। – Trent

+0

जो आपको धन्यवाद देता है – Steller

+0

चेक पर क्लिक करना न भूलें, धन्यवाद ;-) –

4
printf("%#08x", convert); // prints zeros 

इस लाइन काम करने के लिए नहीं जा रहा है क्योंकि आप printf बता रहे हैं कि आप int (%x का उपयोग करके) में गुजर रहे हैं, लेकिन वास्तव में आप इसे float में पास कर रहे हैं।

इस लाइन के साथ आपका इरादा क्या है? हेक्स में फ़्लोटिंग पॉइंट नंबर के बाइनरी प्रस्तुति को दिखाने के लिए? यदि हां, तो आप कुछ इस तरह की कोशिश करना चाहते हो सकता है:

printf("%lx\n", *(unsigned long *)(&convert)); 

क्या इस लाइन कर रहा है परिवर्तित (&convert) का पता ले जा रहा है जो एक नाव के लिए सूचक है और एक सूचक में कास्टिंग एक अहस्ताक्षरित लंबे समय तक (ध्यान दें: जिस प्रकार आप यहां डाले गए हैं, वह फ्लोट के आकार और आपके सिस्टम पर लंबे समय के आधार पर भिन्न हो सकता है)।पिछले * लंबे एक अहस्ताक्षरित लंबे जो printf

+0

आपके द्वारा किए गए कार्यों की व्याख्या के लिए धन्यवाद। बहुत उपयोगी – Steller

+0

मुझे उत्सुकता है कि मैं इसे इस तरह प्रारूपित करने के लिए कैसे प्राप्त कर सकता हूं: 0xFFFFFFE 0xffffffe के बजाय। - यदि मैं अपरकेस एक्स का उपयोग करता हूं तो इसकी तरह 0XFFFFFFFE मुझे x छोटा और बाकी बड़ा चाहिए .. – Steller

+1

@ कोरी "% # 08X" – Trent

1

किसी पूर्णांक एक्स को देखते हुए को बदलने नाव, तो हेक्स में है कि नाव के बाइट्स बाहर मुद्रण कुछ इस तरह से किया जा सकता है:

show_as_float(int x) { 
    float xx = x; 

    //Edit: note that this really prints the value as a double. 
    printf("%f\t", xx); 

    unsigned char *ptr = (unsigned char *)&xx; 

    for (i=0; i<sizeof(float); i++) 
     printf("%2.2x", ptr[i]); 
} 

मानकों (सी ++ और C99) "विशेष ऋण वितरण के" देने unsigned char के लिए, तो यह देखने के लिए उन्हें इस्तेमाल करने के लिए सुरक्षित है किसी भी वस्तु के बाइट्स। सी 8 9/9 0 ने इसकी गारंटी नहीं दी, लेकिन फिर भी यह उचित रूप से पोर्टेबल था।

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

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