2017-02-28 9 views
14

विजुअल स्टूडियो 2015 सी ++ का उपयोग, 14.0.25431.01 अद्यतन 3. मेरे पास मेरे कोड में अप्रत्याशित व्यवहार है। संकलित करें और 64 बिट के साथ चलाने के लिए, रिलीज:uint32_t को uint64_t पर कास्टिंग अलग-अलग मान में परिणाम देता है?

#include <iostream> 
#include <stdint.h> 

int main(int, char**) { 
    for (uint32_t i = 1; i < 3; ++i) { 
     uint32_t a = i * 0xfbd1e995; 
     uint64_t b = a; 

     std::cout << a << " 32bit" << std::endl; 
     std::cout << b << " 64bit" << std::endl; 
    } 
} 

मैं उम्मीद करते हैं कि a और b एक ही मूल्य है, लेकिन मैं इस आउटपुट प्राप्त जब मैं इस चलाएँ:

4224838037 32bit 
4224838037 64bit 
4154708778 32bit 
8449676074 64bit 

ऐसा लगता है कि संकलक की जगह लग 64 बिट गुणा के साथ 32 बिट गुणा। क्या ऐसा करने की अनुमति है, या यह एक कंपाइलर बग है? जी ++ और क्लैंग दोनों मुझे उन नंबरों को देते हैं जिन्हें मैं उम्मीद करता हूं।

संपादित करें: मैंने अपने कोड को एक सरल संस्करण के साथ अपडेट किया है जिसमें एक ही समस्या है। इसके अलावा, I've just submitted a bug report

+0

जीसीसी और बजना के साथ कोई रेप्रो। यह बिल्कुल नहीं होना चाहिए। संपादित करें: रेक्सस्टर पर वीएस के साथ भी कोई repro। –

+0

मिंगव और विजुअल स्टूडियो कंपाइलर के साथ भी पुन: पेश नहीं कर सकता है। – SingerOfTheFall

+0

वीएस का कौन सा संस्करण आप उपयोग कर रहे हैं? क्या आपने रिलीज 64 बिट संकलित किया था? – martinus

उत्तर

1

ऐसा लगता है कि इस हॉटफिक्स समस्या ठीक होती है, कम से कम वी.एस. 2015 के लिए:

https://support.microsoft.com/en-us/help/3207317/visual-c-optimizer-fixes-for-visual-studio-2015-update-3

लेकिन ऐसा लगता है कि वी.एस. 2008, 2010, 2013 अभी भी इस बग से प्रभावित हैं।

सूत्रों का कहना है:

7

मैं VS2010 पर इस पुन: पेश कर सकता है, और तत्काल कारण यह है: चूंकि यह एक 64 बिट अलावा है

add ebx, 5BD1E995h ; this is x 
add rdi, 5BD1E995h ; this is a 64bit version of x 

, यह सिर्फ उच्च 32 बिट में ले जाएगा। यह कम से कम 64 बिट गुणा को अपनाने से अधिक समझ में आता है, यह प्रेरण परिवर्तनीय उन्मूलन में एक कोने का मामला हो सकता है लेकिन यह सिर्फ अटकलें है।

यह भी मजेदार है कि यह इसे गलत तरीके से कास्ट से भी नहीं बचाता है। rbx में सही मूल्य सही है।

+1

यह गुणा के लिए 'add' का उपयोग क्यों करता है? वैसे भी यह [सीएल 1 9 में दिखाई नहीं दे रहा है] (https://godbolt.org/g/i6Y9is) अब और। मुझे केवल 1540483477 –

+2

के साथ 'imul' मिल सकता है, मुझे लगता है कि संकलक स्मार्ट होने की कोशिश करता है और लूप को 0 से 50 तक बदल देता है, जहां लूप काउंटर निरंतर जोड़ता है, केवल स्थिर जोड़कर। – martinus

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