मेरे पास निम्नलिखित सरल कोड हैं:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
speed1
और speed2
एक ही मूल्य होना चाहिए, लेकिन वास्तव में, मेरे पास है:
speed1 = 61
speed2 = 62
मुझे पता है कि मुझे शायद कास्टिंग के बजाय Math.Round का उपयोग करना चाहिए, लेकिन मैं यह समझना चाहूंगा कि मान अलग-अलग क्यों हैं।
मैंने जेनरेट किए गए बायटेकोड को देखा, लेकिन एक स्टोर और लोड को छोड़कर, ऑपकोड समान हैं।
मैंने जावा में भी समान कोड की कोशिश की, और मैं सही ढंग से 62 और 62 प्राप्त करता हूं।
क्या कोई इसे समझा सकता है?
संपादित करें: वास्तविक कोड में, यह सीधे 6.2f * 10 नहीं है, लेकिन एक फ़ंक्शन कॉल * एक स्थिर है। मेरे पास निम्नलिखित बायोटेक है:
के लिए speed1
:
IL_01b3: ldloc.s V_8
IL_01b5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ba: ldc.r4 10.
IL_01bf: mul
IL_01c0: conv.i4
IL_01c1: stloc.s V_9
के लिए speed2
:
IL_01c3: ldloc.s V_8
IL_01c5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ca: ldc.r4 10.
IL_01cf: mul
IL_01d0: stloc.s V_10
IL_01d2: ldloc.s V_10
IL_01d4: conv.i4
IL_01d5: stloc.s V_11
हम देख सकते हैं कि ऑपरेंड फ्लोट हैं और केवल यही अंतर है stloc/ldloc
।
वर्चुअल मशीन के लिए, मैंने मोनो / विन 7, मोनो / मैकओएस और .NET / विंडोज के साथ एक ही परिणाम की कोशिश की।