कृपया प्रोग्राम के आउटपुट को समझने में मेरी मदद करें:

int main()
{
    char a = 0x99;
    printf("%02x\n", a);
    return 0;
}

आउटपुट:

ffffff99

आउटपुट ऐसा क्यों है?

0
manikanta 25 अप्रैल 2017, 09:39
अपरिभाषित व्यवहार, जैसा आप एक चार पास कर रहे हैं, लेकिन %x एक अहस्ताक्षरित पूर्णांक तर्क की अपेक्षा करता है।
 – 
Ilja Everilä
25 अप्रैल 2017, 09:43
2
पढ़ें यह
 – 
BLUEPIXY
25 अप्रैल 2017, 09:46

3 जवाब

खेल में कई कारक हैं। एक बात के लिए, आपके कंप्यूटर पर, सादा char एक हस्ताक्षरित प्रकार है, अहस्ताक्षरित प्रकार नहीं। दूसरे के लिए, printf() जैसे विविध फ़ंक्शन के तर्क पूर्णांक प्रचार नियमों से गुजरते हैं, इसलिए आपका char int में बदल जाता है, और क्योंकि यह है हस्ताक्षरित, 0x99 एक char के रूप में एक ऋणात्मक मात्रा है, इसलिए यह 0xFFFFFF99 तक साइन-विस्तारित हो जाता है, और इसलिए इस तरह प्रिंट हो जाता है।

अपेक्षित परिणाम प्राप्त करने के लिए, इनमें से किसी एक का उपयोग करें:

printf("%02x", (unsigned char)a);
printf("%02x", a & 0xFF);
4
Jonathan Leffler 25 अप्रैल 2017, 09:45

यदि आपका लक्ष्य हेक्स मान को प्रिंट करना है, तो आपको वैरिएबल को uint8_t घोषित करना होगा जो मूल रूप से एक बाइट है और इसे नीचे के रूप में प्रिंट करें

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint8_t a=0x99;
    printf("%x",a);
}
1
Alexander Cherednichenko 25 अप्रैल 2017, 09:54

पूर्णांक प्रचार के लिए नीचे पढ़ें।

यदि दोनों ऑपरेंड का प्रकार समान है, तो आगे रूपांतरण की आवश्यकता नहीं है।

अन्यथा, यदि दोनों ऑपरेंड ने पूर्णांक प्रकारों पर हस्ताक्षर किए हैं या दोनों में अहस्ताक्षरित पूर्णांक प्रकार हैं, तो कम पूर्णांक रूपांतरण रैंक वाले ऑपरेंड को अधिक रैंक वाले ऑपरेंड के प्रकार में बदल दिया जाता है।

अन्यथा, यदि अहस्ताक्षरित पूर्णांक प्रकार वाले ऑपरेंड की रैंक अन्य ऑपरेंड के प्रकार के रैंक से अधिक या बराबर है, तो हस्ताक्षरित पूर्णांक प्रकार वाले ऑपरेंड को अहस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड के प्रकार में बदल दिया जाता है।

अन्यथा, यदि हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड का प्रकार अहस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड के प्रकार के सभी मानों का प्रतिनिधित्व कर सकता है, तो अहस्ताक्षरित पूर्णांक प्रकार वाला ऑपरेंड हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड के प्रकार में परिवर्तित हो जाता है।

अन्यथा, दोनों ऑपरेंड हस्ताक्षरित पूर्णांक प्रकार के साथ ऑपरेंड के प्रकार के अनुरूप अहस्ताक्षरित पूर्णांक प्रकार में परिवर्तित हो जाते हैं।

आपके मामले में नियम 3 लागू होता है, क्योंकि प्रिंटफ अहस्ताक्षरित int की अपेक्षा करता है और आप हस्ताक्षरित चार देते हैं।

0
Martin Chekurov 25 अप्रैल 2017, 10:22
धारा 6.5.2.2 फ़ंक्शन कॉल अधिक प्रासंगिक है: यदि अभिव्यक्ति जो कॉल किए गए फ़ंक्शन को दर्शाती है, में एक प्रकार है जिसमें एक प्रोटोटाइप शामिल है, तो तर्कों को निहित रूप से परिवर्तित किया जाता है, जैसे कि असाइनमेंट द्वारा, संबंधित पैरामीटर के प्रकारों को लेकर, प्रत्येक पैरामीटर का प्रकार उसके घोषित प्रकार का अयोग्य संस्करण होना। फ़ंक्शन प्रोटोटाइप घोषणाकर्ता में इलिप्सिस नोटेशन अंतिम घोषित पैरामीटर के बाद तर्क प्रकार रूपांतरण को रोकने का कारण बनता है। डिफ़ॉल्ट तर्क प्रचार अनुगामी तर्कों पर किए जाते हैं।
 – 
Jonathan Leffler
25 अप्रैल 2017, 17:31
यह (6.5.2.2) 'डिफ़ॉल्ट तर्क प्रचार' को भी परिभाषित करता है: यदि अभिव्यक्ति जो कॉल किए गए फ़ंक्शन को दर्शाती है, में एक प्रकार है जिसमें एक प्रोटोटाइप शामिल नहीं है, तो पूर्णांक प्रचार प्रत्येक तर्क पर किया जाता है, और तर्क जिनमें प्रकार फ्लोट होता है डबल करने के लिए प्रोत्साहित किया जाता है। इन्हें डिफ़ॉल्ट तर्क प्रचार कहा जाता है।
 – 
Jonathan Leffler
25 अप्रैल 2017, 17:34
और खंड 6.3.1.1 'पूर्णांक प्रचार' को परिभाषित करता है: यदि कोई int मूल प्रकार के सभी मानों का प्रतिनिधित्व कर सकता है (जैसा कि चौड़ाई द्वारा प्रतिबंधित है, बिट-फ़ील्ड के लिए), मान परिवर्तित हो जाता है एक int के लिए; अन्यथा, इसे एक अहस्ताक्षरित int में बदल दिया जाता है। इन्हें पूर्णांक प्रचार कहा जाता है। अन्य सभी प्रकार पूर्णांक प्रचारों द्वारा अपरिवर्तित हैं। पूर्णांक प्रचार चिह्न सहित मूल्य को संरक्षित करते हैं। जैसा कि पहले चर्चा की गई थी, क्या एक ''सादा'' char को हस्ताक्षरित माना जाता है, कार्यान्वयन-परिभाषित है।
 – 
Jonathan Leffler
25 अप्रैल 2017, 17:38
एक फुटनोट 58 भी कहा गया है: पूर्णांक प्रचार केवल लागू होते हैं: सामान्य अंकगणितीय रूपांतरणों के हिस्से के रूप में, कुछ तर्क अभिव्यक्तियों के लिए, यूनरी +, -, और ~ ऑपरेटरों, और शिफ्ट ऑपरेटरों के दोनों ऑपरेटरों के लिए, जैसा कि उनके संबंधित उपखंडों द्वारा निर्दिष्ट किया गया है।
 – 
Jonathan Leffler
25 अप्रैल 2017, 17:38