मैं निम्नलिखित सी कोड है:सी भाषा: #DEFINEd मान 8-बिट गुणा को गड़बड़ करता है। क्यूं कर?
#define PRR_SCALE 255
...
uint8_t a = 3;
uint8_t b = 4;
uint8_t prr;
prr = (PRR_SCALE * a)/b;
printf("prr: %u\n", prr);
यदि मैं यह संकलन (एक msp430 मंच संकलक का उपयोग कर, एक छोटा सा एम्बेडेड ओएस के लिए contiki कहा जाता है), जबकि मैं उम्मीद 191. (uint8_t typedef है 'परिणाम 0 है एक अहस्ताक्षरित चार)
के रूप में एड अगर मैं के लिए इसे बदल:
uint8_t a = 3;
uint8_t b = 4;
uint8_t c = 255;
uint8_t prr;
prr = (c * a)/b;
printf("prr: %u\n", prr);
इसे सही ढंग से काम करता है और प्रिंट 191.
01,235,उबंटू बॉक्स पर जीसीसी का उपयोग करके इस 'सामान्य' के एक साधारण संस्करण को संकलित करना दोनों मामलों में सही मूल्य प्रिंट करता है।
मुझे बिल्कुल यकीन नहीं है कि यह क्यों है। मैं पहले से एक चर के लिए DEFINED मान निर्दिष्ट करके इसे बाधित कर सकता हूं, लेकिन मैं ऐसा नहीं करता।
क्या कोई जानता है कि यह क्यों है? शायद इसके बारे में कुछ और जानकारी के लिंक के साथ?
मैं निश्चित रूप से दोनों को 1 9 1 प्रिंट करने की उम्मीद करता हूं। दूसरे मामले में, पहले सी और ए को स्वतंत्र रूप से int में प्रचारित किया जाता है और इसलिए उनका गुणा अधिक नहीं हो सकता है। पहले मामले में भी ऐसा ही होता है (हालांकि वहां, PRR_SCALE पहले से ही int है - लेकिन इससे इंट को बढ़ावा देने में कोई बदलाव नहीं आएगा)। आपके बॉक्स पर आपका जीसीसी बिल्कुल ठीक व्यवहार करता है। –
जांचें कि आपके पास हेडर stdio.h शामिल है। मुझे पता है कि msp430 के लिए एक कंपाइलर अंतर्निहित फ़ंक्शन घोषणाओं को होने की अनुमति देता है: यदि ऐसा है, तो printf को कॉल अपरिभाषित व्यवहार का कारण बनता है, और "0" परिणाम इस प्रकार समझाया जाएगा। केवल मेरे दो सेंट्स। ऐसा नहीं लगता कि यह एक उत्तर के लायक है :) –
@litb: stdio.h शामिल है। – Rabarberski