2016-04-06 7 views
35

क्या होता है यदि कोई नकारात्मक फ़्लोटिंग पॉइंट मान अप्रमाणित अभिन्न प्रकार के मान में परिवर्तित हो जाता है? मानक उद्धरण की सराहना की जाएगी। जिस समस्या का सामना कर रहा हूं वह एक संस्करण वर्ग से हस्ताक्षरित अभिन्न प्रकारों के मानों में रूपांतरण है, जिसमें फ़्लोटिंग-पॉइंट प्रकार का ऑब्जेक्ट होता है।नकारात्मक फ़्लोटिंग पॉइंट मान को एक हस्ताक्षरित int में परिवर्तित करने का व्यवहार क्या है?

उदाहरण:

unsigned i = -.1; 
+1

कृपया _converted_ को परिभाषित करें। –

+3

क्या आपने ** इसे आजमाया **? आपको किस तरह की समस्या हो रही है? – jtbandes

+8

@jtbandes: यह एक गहरा सवाल है। यह सबसे अच्छा, कार्यान्वयन परिभाषित किया जाएगा। – Bathsheba

उत्तर

40

मामले में नकारात्मक मूल्य -1.0 या कम है, यह अनिर्धारित व्यवहार के बाद से अभिन्न अंग तो एक अहस्ताक्षरित संख्या से नहीं दर्शाया जा सकता invokes। अन्यथा, (जैसा कि -0.1 के मामले में), यदि इसे एक पूर्णांक प्रकार द्वारा दर्शाया जा सकता है, तो यह अच्छी तरह से परिभाषित व्यवहार है। 2011:: C11 मानक, आईएसओ 9899 देखें (यानी

6.3.1.4

जब अचल चल प्रकार की एक निश्चित मूल्य _Bool के अलावा अन्य कोई पूर्णांक प्रकार में बदल जाती है, आंशिक हिस्सा त्याग दिया जाता है, मान शून्य की ओर छोटा कर दिया गया है)। यदि अभिन्न अंग का मान पूर्णांक प्रकार द्वारा प्रदर्शित नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है। 61)

और फिर वहाँ एक गैर मानक पाद टिप्पणी ऊपर पाठ समझा है:

61) remaindering कार्रवाई जब पूर्णांक प्रकार के एक मूल्य अहस्ताक्षरित प्रकार में बदल जाती है होने की जरूरत नहीं प्रदर्शन किया गया जब वास्तविक फ़्लोटिंग प्रकार का मान हस्ताक्षरित प्रकार में परिवर्तित हो जाता है। इस प्रकार, पोर्टेबल असली फ़्लोटिंग मानों की सीमा (-1, Utype_MAX + 1) है।

आईएसओ/आईईसी 98 99: 1 999 (सी 99) में बिल्कुल वही पाठ है।

+2

अनुमान लगाने के बजाय इसे कैसे देख रहा है यह सी मानक है? असल में मैंने देखा है कि सवाल बहु-टैग किया गया है। एक उत्थान है। – Bathsheba

+1

@ बाथशेबा सवाल सी और सी ++ दोनों लेबल किया गया है, तो मानक मानक होगा। लेकिन यह एक अच्छा सवाल है। –

+0

@ बाथशेबा हां। संपादन के साथ स्पष्ट। – Lundin

28

यदि फ्लोटिंग पॉइंट नंबर -1.0 से कम या बराबर है तो यह सी 99 में अपरिभाषित व्यवहार है। यदि यह रेंज (-1.0, 0.0) में है, जिसके परिणामस्वरूप मूल्य 0.

C99, §6.3.1.4 से

, हो जाएगा पैरा 1

असली चल प्रकार की एक निश्चित मूल्य में बदल जाती है जब _Bool के अलावा एक पूर्णांक प्रकार, आंशिक भाग को त्याग दिया जाता है (यानी, मान शून्य की ओर छोटा हो जाता है)। यदि अभिन्न अंग का मान पूर्णांक प्रकार द्वारा प्रदर्शित नहीं किया जा सकता है, तो व्यवहार को परिभाषित किया गया है

फुटनोट 50 (-1.0, 0.0) रेंज के व्यवहार को स्पष्ट करता है।

5

आपका उदाहरण, unsigned i = -.1;अच्छी तरह से परिभाषित दोनों C11 और C99 द्वारा है, और परिणाम i == 0 है।

N1570 से उद्धरित, 6.3.1.4 रियल फ्लोटिंग और पूर्णांक:

  1. जब अचल चल प्रकार की एक निश्चित मान एक पूर्णांक _Bool के अलावा अन्य प्रकार में बदल जाती है, आंशिक हिस्सा त्याग दिया जाता है (यानी, मूल्य शून्य की ओर छोटा कर दिया गया है)।अभिन्न अंग का मूल्य पूर्णांक प्रकार से प्रदर्शित नहीं किया जा सकता है, तो व्यवहार undefined.61)

61) remaindering कार्रवाई जब पूर्णांक प्रकार का एक मूल्य अहस्ताक्षरित प्रकार की जरूरत में बदल जाती है है तब नहीं किया जा सकता जब वास्तविक फ़्लोटिंग प्रकार के मान को हस्ताक्षरित प्रकार में परिवर्तित किया जाता है। इस प्रकार, पोर्टेबल असली फ़्लोटिंग मानों की श्रेणी है (-1, Utype_MAX + 1)।

N869 से उद्धरित, 6.3.1.4 रियल फ्लोटिंग और पूर्णांक:

# 1

जब अचल चल प्रकार की एक निश्चित मूल्य _Bool के अलावा अन्य कोई पूर्णांक प्रकार में बदल जाती है, आंशिक भाग को त्याग दिया जाता है (यानी, मान शून्य की ओर छोटा कर दिया जाता है)। अभिन्न अंग का मूल्य पूर्णांक प्रकार से प्रदर्शित नहीं किया जा सकता है, तो व्यवहार undefined.43)

43) है remaindering कार्रवाई जब पूर्णांक प्रकार का एक मूल्य अहस्ताक्षरित प्रकार में बदल जाती है की जरूरत नहीं है जब वास्तविक फ़्लोटिंग प्रकार के मान को हस्ताक्षरित प्रकार में परिवर्तित किया जाता है तब किया जाता है। इस प्रकार, पोर्टेबल असली फ़्लोटिंग मानों की श्रेणी है (-1, Utype_MAX + 1)।

हालांकि, अगर आप कोटेशन से देखते हैं, सीमा (-1, Utype_MAX +1) के बाहर फ्लोटिंग प्वाइंट स्थिरांक कन्वर्ट करने के लिए कोशिश कर सकते हैं के रूप में invokes अपरिभाषित व्यवहार।

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