C ++ में क्यों स्थिर संख्याओं का static_cast <unsign> भिन्न होता है यदि संख्या स्थिर है या नहीं


28

क्या सी ++ नियम है कि साधन के बराबर है झूठा ?। दिया हुआ:

float f {-1.0};
bool equal = (static_cast<unsigned>(f) == static_cast<unsigned>(-1.0));

जैसे https://godbolt.org/z/fcmx2P

#include <iostream>

int main() 
{
          float   f {-1.0};
    const float  cf {-1.0};

    std::cout << std::hex;
    std::cout << " f" << "=" << static_cast<unsigned>(f) << '\n';
    std::cout << "cf" << "=" << static_cast<unsigned>(cf) << '\n';

    return 0;
}

निम्नलिखित उत्पादन करता है:

 f=ffffffff
cf=0

6
एक उत्थान है: आप अपरिभाषित व्यवहार के बारे में एक बार-बार भूल गए नियम से पकड़े गए हैं!
बाथशीबा

एक नकारात्मक नाव को एक अहस्ताक्षरित में परिवर्तित करने के क्या परिणाम मिलते हैं?
एमॅड्यूस

1
@Addus शायद नकारात्मक पूर्णांक को परिवर्तित करते समय हमारे चारों ओर सामान्य आवरण है। मुझे यह जांचना था कि यह यूबी था क्योंकि इससे मुझे आश्चर्य हुआ।
एपीग्रामग्राम

1
@ अमाडस, यह अंतर को समझने का मामला था। मैंने कुछ हफ़्ते पहले एक टाइपो बग तय किया था ... एक कॉन्स्ट-फ्लोट स्पष्ट रूप से अहस्ताक्षरित (बग) में डाली गई थी, और स्पष्ट रूप से हस्ताक्षरित (एक हस्ताक्षरित फ़ंक्शन पैरामीटर के रूप में)। मैंने बाद में विचार किया कि मूल बग फ़ंक्शन में शून्य मान क्यों पैदा कर रहा है। परीक्षण से पता चलता है कि यह फ्लोट कांस्टेबल था। एक गैर-कॉन्स्टेबल फ़्लोट जो स्पष्ट रूप से डाली गई थी और फिर हस्ताक्षर करने के लिए वापस डाली गई थी, एक ही bahaviour में परिणाम नहीं हुआ - दो बार-कास्ट नॉन-कॉस्ट का मूल और अपेक्षित मूल्य था।
ग्रेमुएटीआर

जवाबों:


26

अपने कार्यक्रम के व्यवहार है अपरिभाषित : सी ++ मानक एक नकारात्मक के रूपांतरण को परिभाषित नहीं करता चल बिन्दु प्रकार एक करने के लिए unsignedलिखें।

(ध्यान दें कि रैप-अराउंड व्यवहार केवल नकारात्मक अभिन्न प्रकारों पर लागू होता है ।)

इसलिए आपके प्रोग्राम आउटपुट को समझाने के प्रयास में बहुत कम बिंदु हैं।


1
क्या यह परिभाषित है कि मैं फ़्लोट में परिवर्तित करूंगा-> int-> इसके बजाय अहस्ताक्षरित?
यिकिसार्विनें

5
@ यक्षीसारविन: केवल तभी है जब floatसीमा एक के भीतर हो int
बतशेबा

मैं स्वीकार करता हूं कि यूबी सही उत्तर है, और इसलिए इसका अंत होना चाहिए ... लेकिन यह दिया गया है ... क्या संभावना संकलक-लेखक का जवाब है जो बताता है कि कंपाइलर एक्सप्लोरर (क्लैंग / जीसीसी / डीजीजीपीपी) पर सभी कंपाइलर क्यों उत्पन्न होते हैं समतुल्य (UB) आउटपुट?
ग्रेमेट्रेट

5
@GreyMattR यदि कंपाइलर यह साबित कर सकता है कि कास्ट के समय वैल्यू नेगेटिव होने की गारंटी है, तो यह कास्ट के परिणाम को अनइंस्टाल्यूटेड छोड़ सकता है, या इसे शून्य पर सेट कर सकता है, या जो कुछ भी करना चाहता है। यदि संकलक यह साबित नहीं कर सकता है, तो उसे कलाकारों को करने के लिए कोड उत्पन्न करना होगा। इस तरह के उद्देश्यों के लिए, यह कोड को पुन: हस्ताक्षरित पूर्णांक प्रकार में डालने के लिए पुन: उपयोग कर सकता है (परिणाम केवल "गलत" होगा यदि कलाकार यूबी है, जिसका अर्थ है कि यह वास्तव में गलत नहीं है)। अधिक आक्रामक अनुकूलन के साथ, कास्ट को नॉन-कास्ट मामले में भी उत्सर्जित नहीं किया जाएगा।
ब्रायन

@ ब्रायन, उस उपयोगी स्पष्टीकरण के लिए धन्यवाद।
GreyMattR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.