ভয়াবহ উত্তর গ্যালোর
ওজগুর ওসিতিটক
আপনি যখন স্বাক্ষরিত থেকে স্বাক্ষরিত (এবং তদ্বিপরীত) থেকে কাস্ট করেন তখন সংখ্যার অভ্যন্তরীণ উপস্থাপনা পরিবর্তন হয় না। কী পরিবর্তন হয় তা সংকলক কীভাবে সাইন বিটের ব্যাখ্যা করে।
এটি সম্পূর্ণ ভুল।
ম্যাটস ফ্রেড্রিকসন
যখন একটি স্বাক্ষরযুক্ত এবং একটি স্বাক্ষরযুক্ত ভেরিয়েবল যুক্ত করা হয় (বা কোনও বাইনারি অপারেশন) উভয়ই স্পষ্টতই স্বাক্ষরবিহীন স্বাক্ষরে রূপান্তরিত হয়, যা এক্ষেত্রে একটি বিশাল ফলাফল হতে পারে।
এটিও ভুল। স্বাক্ষরবিহীন টাইপগুলিতে প্যাডিং বিটের কারণে তাদের সমান যথাযথতা থাকাতে স্বাক্ষরিত ints ints এ প্রচার হতে পারে।
এসএমএইচ
আপনার সংযোজন ক্রিয়াকলাপটি ইন্টকে স্বাক্ষরবিহীন ইনটে রূপান্তরিত করে।
ভুল। হতে পারে এবং সম্ভবত এটি না।
স্বাক্ষরযুক্ত না থেকে স্বাক্ষরিত রূপান্তর রূপান্তর হ'ল বাস্তবায়ন নির্ভর। (তবে এটি সম্ভবত বেশিরভাগ প্ল্যাটফর্মগুলিতে আপনি যেভাবে প্রত্যাশা করেছিলেন সেভাবে কাজ করে))
ভুল। এটি হয় অপরিবর্তিত আচরণ যদি এটি অতিরিক্ত প্রবাহের কারণ হয় বা মান সংরক্ষণ করা হয়।
নামবিহীন
আমার মান স্বাক্ষরবিহীন ইনটে রূপান্তরিত ...
ভুল। স্বাক্ষরবিহীন ইন্টের সাথে সম্পর্কিত কোনও পূর্বের নির্ভুলতার উপর নির্ভর করে।
টেলর দাম
আগে যেমন উত্তর দেওয়া হয়েছিল, আপনি কোনও সমস্যা ছাড়াই স্বাক্ষরিত এবং স্বাক্ষরিতদের মধ্যে পিছনে পিছনে পিছনে যেতে পারেন।
ভুল। একটি স্বাক্ষরিত পূর্ণসংখ্যার পরিসরের বাইরে কোনও মান সঞ্চয় করার চেষ্টা করা হয় অপরিজ্ঞিত আচরণের ফলাফল।
এখন আমি শেষ পর্যন্ত প্রশ্নের উত্তর দিতে পারি।
যদি পূর্বের নির্ভুলতা স্বাক্ষরবিহীন int এর সমান হয় তবে আপনাকে একটি স্বাক্ষরিত ইনট হিসাবে উন্নীত করা হবে এবং আপনি অভিব্যক্তি (u + i) থেকে -4444 পাবেন। এখন, আপনার এবং আমার অন্যান্য মান হওয়া উচিত, আপনি উপচে পড়া এবং অপরিজ্ঞাত আচরণ পেতে পারেন তবে সেই সঠিক সংখ্যাগুলির সাথে আপনি পাবেন -4444 [1] । এই মান টাইপ int হবে। তবে আপনি সেই মানটি একটি স্বাক্ষরবিহীন ইনট হিসাবে সংরক্ষণ করার চেষ্টা করছেন যাতে তারপরে একটি স্বাক্ষরবিহীন অন্তর্ভুক্ত হয়ে যায় এবং ফলাফলটির ফলাফলটি শেষ হয়ে যায় (UINT_MAX + 1) - 4444।
স্বাক্ষরযুক্ত ইন্টিরিউশনটির নির্ভুলতা যদি কোন পূর্বের চেয়ে বেশি হয় তবে স্বাক্ষরিত মানটি একটি স্বাক্ষরিত মান হিসাবে উত্সাহিত হবে (UINT_MAX + 1) - 5678 যা অন্য স্বাক্ষরযুক্ত ইন্ট 1234-এ যুক্ত হবে আপনার এবং আমার উচিত অন্যান্য মানগুলি, যা {0..UINT_MAX range রেঞ্জের বাইরে প্রকাশ করে, মান (UINT_MAX + 1) হয় ফলাফল বা t 0..UINT_MAX সীমার মধ্যে না পড়ে অবধি বিয়োগ করা হবে এবং কোনও অপরিবর্তিত আচরণ ঘটবে না ।
নির্ভুলতা কি?
পূর্ণসংখ্যার প্যাডিং বিট, সাইন বিট এবং মান বিট রয়েছে। স্বাক্ষরবিহীন পূর্ণসংখ্যার স্পষ্টতই একটি চিহ্ন বিট নেই। স্বাক্ষরবিহীন চরটি প্যাডিং বিট না রাখার আরও গ্যারান্টিযুক্ত। একটি পূর্ণসংখ্যার মানের বিটের সংখ্যা হ'ল এটি কতটা নির্ভুল হয়।
[Gotchas]
প্যাডিং বিট উপস্থিত থাকলে কোনও পূর্ণসংখ্যার যথার্থতা নির্ধারণ করতে একা ম্যাক্রো ম্যাক্রো ব্যবহার করা যায় না। এবং বাইটের আকার C99 দ্বারা সংজ্ঞায়িত হিসাবে একটি অক্টেট (আট বিট) হতে হবে না।
[1] দুটি পয়েন্টের একটিতে ওভারফ্লো হতে পারে। হয় সংযোজনের আগে (প্রচারের সময়) - যখন আপনি স্বাক্ষরবিহীন কোনও int থাকে যা কোনও int এর ভিতরে ফিট করার পক্ষে খুব বড় large স্বাক্ষরবিহীন ইন্টটি কোনও প্রান্তের সীমার মধ্যে থাকলেও সংযোজনের পরেও ওভারফ্লো হতে পারে, সংযোজনের পরে ফলাফলটি এখনও প্রবাহিত হতে পারে।