CSAPP के अनुसार अभिव्यक्ति (int) + 1e10 -2147483648 की उपज क्यों नहीं है? [डुप्लिकेट]

Dec 12 2020

मैं सीएस पढ़ रहा हूं : एपीपी (एक x86-64 विधानसभा / निम्न-स्तरीय पाठ्यपुस्तक) और इसमें उल्लेख है:

से floatया doubleकरने के लिए int, मान शून्य की ओर बढ़ा दिया जाएगा। उदाहरण के लिए, में 1.999परिवर्तित हो जाएगा 1, जबकि इसके अलावा में −1.999परिवर्तित हो जाएगा −1., मान अतिप्रवाह हो सकता है। सी मानक इस मामले के लिए एक निश्चित परिणाम निर्दिष्ट नहीं करते हैं। इंटेल-संगत माइक्रोप्रोसेसर बिट पैटर्न [10 ... 00] ( TMinwशब्द आकार के लिए w) को पूर्णांक अनिश्चित मान के रूप में नामित करते हैं । फ़्लोटिंग पॉइंट से पूर्णांक तक कोई भी रूपांतरण जो एक उचित पूर्णांक सन्निकटन निर्दिष्ट नहीं कर सकता है, इस मान को प्राप्त करता है। इस प्रकार, अभिव्यक्ति (int) +1e10की पैदावार -2147483648, एक सकारात्मक एक से एक नकारात्मक मूल्य पैदा होता है।

क्या है इंटेल-संगत माइक्रोप्रोसेसरों यहाँ उल्लेख किया? x86वास्तुकला AMD श्रृंखला सहित?

वैसे भी, मेरे पास Win10 64bit मशीन के साथ Intel i5 है और मैंने Visual Studio के तहत कोशिश की:

    #include <iostream>
    using namespace std;
    
    int main() {
        int b = (int)+1e10;
        cout << b << endl;
    }

और 1410065408आउटपुट के रूप में मिलता है ।

इसके अलावा मैंने कोशिश की int32_tऔर हो 1410065408भी जाता है।

तो मेरे पास वह परिणाम क्यों नहीं है -2147483648जो [10 ... 00]पुस्तक के अनुसार है?

जवाब

2 chux-ReinstateMonica Dec 12 2020 at 09:49

यहां तक ​​कि अगर प्रोसेसर का उपयोग किया जाता है, "फ्लोटिंग पॉइंट से पूर्णांक तक कोई भी रूपांतरण जो एक उचित पूर्णांक सन्निकटन को असाइन नहीं कर सकता है, तो यह मान उत्पन्न करता है।", संकलक को यह पालन करने की आवश्यकता नहीं है कि यह लक्ष्य प्राप्त करने के लिए अन्य कोड का उपयोग कर सकता है।

विशेष रूप से, ऐसे मान जिन्हें कंपाइलर के समय पर निर्धारित किया जा सकता है, जैसे some_32_bit_int = (int)+1e10;एक मान प्राप्त कर सकते हैं some_32_bit_int = 10000000000 & 0xFFFFFFFF;या 1410065408जो पूरी तरह से एक प्रोसेसर से स्वतंत्र है।

यदि इंटीग्रल भाग के मान को पूर्णांक प्रकार से दर्शाया नहीं जा सकता है, तो व्यवहार अपरिभाषित है। C17dr § 6.3.1.4 1

पुस्तक प्रोसेसर का वर्णन करती है, संकलक का नहीं।