CSAPP के अनुसार अभिव्यक्ति (int) + 1e10 -2147483648 की उपज क्यों नहीं है? [डुप्लिकेट]
मैं सीएस पढ़ रहा हूं : एपीपी (एक 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]
पुस्तक के अनुसार है?
जवाब
यहां तक कि अगर प्रोसेसर का उपयोग किया जाता है, "फ्लोटिंग पॉइंट से पूर्णांक तक कोई भी रूपांतरण जो एक उचित पूर्णांक सन्निकटन को असाइन नहीं कर सकता है, तो यह मान उत्पन्न करता है।", संकलक को यह पालन करने की आवश्यकता नहीं है कि यह लक्ष्य प्राप्त करने के लिए अन्य कोड का उपयोग कर सकता है।
विशेष रूप से, ऐसे मान जिन्हें कंपाइलर के समय पर निर्धारित किया जा सकता है, जैसे some_32_bit_int = (int)+1e10;
एक मान प्राप्त कर सकते हैं some_32_bit_int = 10000000000 & 0xFFFFFFFF;
या 1410065408
जो पूरी तरह से एक प्रोसेसर से स्वतंत्र है।
यदि इंटीग्रल भाग के मान को पूर्णांक प्रकार से दर्शाया नहीं जा सकता है, तो व्यवहार अपरिभाषित है।
C17dr § 6.3.1.4 1
पुस्तक प्रोसेसर का वर्णन करती है, संकलक का नहीं।