को देखते हुए निम्नलिखित स्निपेट:लंबे बनाम पूर्णांक गुणन
#include <stdio.h>
typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;
int main()
{
printf("%i\n", sizeof(int8));
printf("%i\n", sizeof(int32));
printf("%i\n", sizeof(int64));
int8 a = 100;
int8 b = 100;
int32 c = a * b;
printf("%i\n", c);
int32 d = 1000000000;
int32 e = 1000000000;
int64 f = d * e;
printf("%I64d\n", f);
}
MinGW जीसीसी 3.4.5 के साथ उत्पादन होता है (-O0):
1
4
8
10000
-1486618624
पहले गुणा एक int32 को आंतरिक रूप से casted है (असेंबलर आउटपुट के अनुसार)। दूसरा गुणा नहीं किया जाता है। मुझे यकीन नहीं है कि परिणाम भिन्न हैं क्योंकि प्रोग्राम आईए 32 पर चल रहा था, या क्योंकि इसे सी मानक में कहीं परिभाषित किया गया है। फिर भी मुझे दिलचस्पी है कि अगर यह सटीक व्यवहार कहीं परिभाषित किया गया है (आईएसओ/आईईसी 98 99?), क्योंकि मुझे बेहतर समझना अच्छा लगता है कि मुझे मैन्युअल रूप से क्यों डालना है (मुझे एक अलग वास्तुकला से प्रोग्राम को पोर्ट करने में समस्याएं हैं)।
बहुत अच्छी तरह से डाल दिया। @azraiyl को उस पंक्ति को 'int64 f = (int64) d * e; ' –
में बदलना चाहिए क्षमा करें कि मैंने यह नहीं कहा है कि मुझे यहां समाधान पता है। मुझे क्या दिलचस्पी है, क्यों पहले मामले में गुणा int32 * int32 है और int8 * int8 नहीं है। यहां तक कि यदि सीपीयू केवल int32 गुणा का समर्थन करता है तो गुणा के बाद इसे int8 पर वापस जाया जा सकता है। लेकिन IA32 imul निर्देश 8-बिट रजिस्टरों (AL, ...) के लिए काम करता है। – azraiyl
@azrayl: कम से कम C90 में, सी ने सभी अंकगणितीय ऑपरेटरों को 'int' में प्रचारित किया, यदि वे छोटे प्रकार के थे। सी 99 मानक में एक नज़र से पता चलता है कि यह अब मामला नहीं है, लेकिन मुझे सच में यकीन नहीं है। आप किस सी संकलक का उपयोग कर रहे हैं, और यदि लागू हो, तो कौन से विकल्प हैं? –