কেন সি ++ এ ধ্রুবক না থাকলে নেতিবাচক সংখ্যার স্ট্যাটিক_কাস্ট <স্বাক্ষরিত> করেন


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
একটি উপভোগ করুন: আপনি অপরিবর্তিত আচরণ সম্পর্কে একটি বিস্মৃত বিস্মৃত নিয়মের দ্বারা ধরা পড়েছেন!
বাথশেবা

নেতিবাচক ফ্লোটকে স্বাক্ষরবিহীন রূপান্তরিত করার কোন ফলাফল আপনি প্রত্যাশা করেন?
Amadeus

1
নেতিবাচক পূর্ণসংখ্যাকে রূপান্তরিত করার সময় অ্যামাদিউস সম্ভবত আমাদের প্রায় সাধারণ মোড়ানো থাকে। আমাকে পরীক্ষা করে দেখতে হয়েছিল যে এটি ইউবি ছিল কারণ এটি আমাকে অবাক করেছিল।
এপ্রোগ্রামার

1
@ আমেদাস, এটি পার্থক্যটি বোঝার ক্ষেত্রে আরও বেশি ঘটনা ছিল। আমি কয়েক সপ্তাহ আগে একটি টাইপো বাগটি ঠিক করেছি ... একটি কনস্ট-ফ্লোট স্পষ্টভাবে স্বাক্ষরবিহীন (বাগ) এ ছুঁড়ে দেওয়া হয়েছিল এবং স্বাক্ষরিতভাবে (স্বাক্ষরিত ফাংশন প্যারামিটার হিসাবে) ফিরিয়ে দেওয়া হয়েছিল। পরে আমি ভাবলাম কেন মূল বাগটি ফাংশনে শূন্যের কারণ ঘটাচ্ছে। পরীক্ষার সূত্র ধরে যে এটি ছিল কারণ ভাসাটি কনস্টেন্ট ছিল। স্বাক্ষরবিহীনভাবে স্পষ্টভাবে কাস্ট করা হয়েছিল এবং তারপরে স্পষ্টভাবে স্বাক্ষরিত হয়ে পুনরায় কাস্ট করা হয়েছিল এমন একটি নন-কনস্টেট ফ্লোটের ফল একই বাহাওয়েরের ফলস্বরূপ ঘটেনি - দ্বিগুণ-কাস্ট নন-কনস্টের মূল এবং প্রত্যাশিত মান ছিল।
গ্রেইম্যাটআর

উত্তর:


26

আপনার প্রোগ্রাম আচরণ করা হয় অনির্দিষ্ট : C ++ স্ট্যান্ডার্ডের একটি নেতিবাচক রূপান্তর সংজ্ঞায়িত না ফ্লোটিং পয়েন্ট টাইপ একটি থেকে unsignedপ্রকার।

(মনে রাখবেন পরিচিত মোড়কের চারপাশের আচরণটি কেবল নেতিবাচক অবিচ্ছেদ্য ধরণের ক্ষেত্রে প্রযোজ্য ।)

সুতরাং আপনার প্রোগ্রাম আউটপুট ব্যাখ্যা করার চেষ্টা করার সামান্য বিন্দু আছে।


1
আমি যদি পরিবর্তে ফ্লোট-> ইন-> স্বাক্ষরিত না করে সংজ্ঞায়িত করা হয়?
ইকিসারভিনভিন

5
@ ইয়াকিসারভিনেন: কেবলমাত্র যদি floatএকটি এর সীমার মধ্যে থাকে int
বাথশেবা

আমি স্বীকার করি যে ইউবি সঠিক উত্তর, এবং তাই এর শেষ হওয়া উচিত ... তবে দেওয়া হয়েছে ... সম্ভবত সংকলক-লেখকের উত্তর কী তা ব্যাখ্যা করে যে কেন কম্পাইলার এক্সপ্লোরারের সমস্ত সংকলক (ক্ল্যাং / জিসিসি / ডিজেজিপি) উত্পাদন করে সমতুল্য (ইউবি) আউটপুট?
গ্রেইম্যাটআর

5
@ গ্রেইম্যাটআর যদি সংকলক প্রমাণ করতে পারে যে ofালাইয়ের সময় মানটি নেতিবাচক হওয়ার গ্যারান্টিযুক্ত, তবে এটি theালাইয়ের ফলাফলটি অবিচ্ছিন্ন করতে পারে, বা এটি শূন্যে সেট করতে পারে বা অন্য যা কিছু করতে চায় তা সেট করতে পারে। সংকলক যদি এটি প্রমাণ করতে না পারে তবে theালাই সঞ্চালনের জন্য কোড তৈরি করতে হবে। এই জাতীয় উদ্দেশ্যে, এটি স্বাক্ষরিত পূর্ণসংখ্যার ধরণের কোডটি পুনরায় ব্যবহার করতে পারে (onlyালাই যদি ইউবি হয় তবে ফলাফলটি কেবল "ভুল" হবে, যার অর্থ এটি আসলে ভুল নয়)। আরও আক্রমণাত্মক অপ্টিমাইজেশনের সাথে, নন-কনস্ট্যান্ট ক্ষেত্রে কাস্টটিও নির্গত হবে না।
ব্রায়ান

@ ব্রায়ান, সেই সহায়ক ব্যাখ্যার জন্য ধন্যবাদ।
গ্রেইম্যাটআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.