একটি গৃহস্থালি মান CHAR_MAX এ CHAR_MIN এর চারপাশে মোড়কের গ্যারান্টিযুক্ত?


10

আমার কোড:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}

আউটপুট:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()

আমরা দেখতে পাচ্ছি যে যখন আমরা কোনও charপরিবর্তনশীল CHAR_MAXসেটটিকে বাড়িয়ে তুলি, তখন এটি প্রায় গুটিয়ে যায় CHAR_MIN। এই আচরণ কি নিশ্চিত? বা এটি অনির্ধারিত আচরণ বা বাস্তবায়ন-নির্দিষ্ট আচরণ হতে চলেছে? সি 99 স্ট্যান্ডার্ড এ সম্পর্কে কী বলে?

[নোট: কী যখন CHAR_MAX (127) চেয়ে বড় দিতে মান গৃহস্থালি বা সি কেন গৃহস্থালির কাজ গ = 129 -127 রূপান্তর করবে? তারা এই প্রশ্নের সমাধান করে না কারণ তারা সীমার বাইরে মূল্য নির্ধারণের বিষয়ে কথা বলায় সীমার বাইরে কোনও মান বাড়ায় না]]


ইনক্রিমেন্ট হ'ল একটি অ্যাসাইনমেন্ট।
উইলিয়াম পার্সেল

2
এটি চরটি স্বাক্ষরিত বা স্বাক্ষরবিহীন কিনা তার উপর নির্ভর করে। স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লো হ'ল অপরিজ্ঞাত আচরণ। সুতরাং আউটপুট কিছু হতে পারে।
ডাব্লার

উত্তর:


15

প্রশ্ন দ্বিগুণ: প্রথমত, হয়

char c = CHAR_MAX;
c += 1;

থেকে পৃথকভাবে মূল্যায়ন

char c = CHAR_MAX;
c = c + 1;

এবং উত্তরটি হ'ল এটি নয় , কারণ সি 11 / সি 18 6.5.16.2p3 :

  1. ফর্মের একটি যৌগিক কার্যনির্বাহী E1 op = E2সহজ অ্যাসাইনমেন্ট এক্সপ্রেশনের সমতুল্য E1 = E1 op (E2)ব্যতীত লভ্যালুটি একবারে E1মূল্যায়ন করা হয় এবং অনির্দিষ্টভাবে-সিকোয়েন্সড ফাংশন কলের সাথে সম্মিলিতভাবে একটি যৌগিক কার্য সম্পাদন একক মূল্যায়ন। যদি E1পারমাণবিক ধরণের থাকে, তবে যৌগিক কার্যভারণ্য হ'ল memory_order_seq_cstমেমরি অর্ডার সিনটিক্স সহ একটি রিড-মডিফাই-রাইটিং অপারেশন । 113)

তারপরে, প্রশ্নটি কী হয় c = c + 1। এখানে অপারেটরগুলি +সাধারণ গাণিতিক রূপান্তরগুলি ভোগ করতে চলেছে cএবং 1তাই উন্নত হয় int, যদি না সত্যিকারের অসম্পূর্ণ আর্কিটেকচারের প্রয়োজন হয় যার charজন্য প্রচার করা হয় unsigned int+তারপরে গণনাটি মূল্যায়ন করা হয় এবং ফলাফল int/ প্রকারের ফলাফলটি unsigned intআবার রূপান্তরিত হয় charএবং এতে সঞ্চিত থাকে c

আছে 3 বাস্তবায়ন-সংজ্ঞায়িত উপায়ে এই তারপর মূল্যায়ন করা যেতে পারে:

  • CHAR_MIN0 এবং তাই charস্বাক্ষরবিহীন।

    হয় charতারপর প্রচারিত হয় intবা হয় unsigned intএবং যদি এটি প্রচারিত হয় intতবে CHAR_MAX + 1অগত্যা এটি intখুব উপযুক্ত হবে এবং উপচে পড়বে না, বা unsigned intএটি ফিট বা শূন্যের চারপাশে আবৃত হতে পারে। যখন পরিবর্তিত মান, যা সংখ্যার দিক থেকে হয় CHAR_MAX + 1বা 0মডিউল কমানোর পরে, ফিরে আসবে c, মডুলো হ্রাসের পরে এটি 0 হয়ে যাবে, অর্থাৎCHAR_MIN

  • অন্যথায় charস্বাক্ষরিত হয়, তারপরে যদি এটিরCHAR_MAX চেয়ে ছোট হয় INT_MAXতবে ফলাফলটি CHAR_MAX + 1একটি মাপসই করা যায় intএবং মানক সি 11 / সি 18 .3.৩.১.৩.২০ নিয়োগের পরে রূপান্তরটির ক্ষেত্রে প্রযোজ্য :

    1. অন্যথায়, নতুন ধরণের স্বাক্ষরিত এবং এতে মানটি উপস্থাপন করা যায় না; হয় ফলাফল বাস্তবায়ন সংজ্ঞায়িত হয় বা বাস্তবায়ন সংজ্ঞায়িত সংকেত উত্থাপিত হয়।
  • বা, iff sizeof (int) == 1 এবং char স্বাক্ষরিত হয়ে থাকে, তারপরে charএকটি হিসাবে প্রচারিত হয় intএবং CHAR_MAX == INT_MAX=> এর CHAR_MAX + 1ফলে একটি পূর্ণসংখ্যার ওভারফ্লো হবে এবং আচরণটি অপরিবর্তিত থাকবে

অর্থাৎ সম্ভাব্য ফলাফলগুলি হ'ল:

  • যদি charস্বাক্ষরবিহীন পূর্ণসংখ্যার টাইপ হয় তবে ফলাফলটি সর্বদা 0, অর্থাৎ CHAR_MIN

  • অন্যথায় charএকটি স্বাক্ষরিত পূর্ণসংখ্যা টাইপ, এবং আচরণটি বাস্তবায়ন-সংজ্ঞায়িত / অপরিজ্ঞাত:

    • CHAR_MIN বা কিছু অন্যান্য বাস্তবায়ন-সংজ্ঞায়িত মান,
    • একটি বাস্তবায়ন-সংজ্ঞায়িত সংকেত উত্থাপিত হয়, সম্ভবত প্রোগ্রামটি শেষ করে,
    • বা আচরণটি এমন কিছু প্ল্যাটফর্মে যেখানে অপরিবর্তিত রয়েছে sizeof (char) == sizeof (int)

সকল বৃদ্ধি অপারেশন c = c + 1, c += 1, c++এবং ++cএকই প্ল্যাটফর্মে একই পার্শ্বপ্রতিক্রিয়া আছে। অভিব্যক্তির মূল্যায়নকৃত মানটি ইনক্রিমেন্টের আগে c++মূল্য হবে c; অন্য তিনটির জন্য, এটি cইনক্রিমেন্টের পরে মূল্য হবে ।


1
sizeof(int) == 1প্রয়োজন হবে CHAR_BITS >= 16, তাই না?
sepp2k

3
@ sepp2k আইডিকে <pedantic>সম্পর্কে CHAR_BITSকিন্তু CHAR_BITহবে >= 16</pedantic>
এন্টি হাপাল

2
charসর্বদা ডিফল্টরূপে স্বাক্ষরবিহীন হওয়ার আরও একটি কারণ ।
chqrlie

1
@ সিএইচকিআলি আমি সম্মত, দুর্ভাগ্যক্রমে এটি হতে পারে যে এটি পূর্বনির্ধারিত হিসাবে স্বাক্ষরিত হয়েছিল কারণ ইতিহাসে পরে স্বাক্ষরহীন ছিল, ইওএফ-র একটি ফিটনেস প্রত্যাশিত নিছক পরিমাণ ভাঙা প্রোগ্রামের কারণে কিছু ক্রোম * পিপি সিস্টেমে এখন পরিবর্তন করা খুব কঠিন হতে পারে চর ..
এন্টি হাপাল

1
কখনও কখনও এটি সরাসরি উত্তর যুক্ত করাও স্পষ্ট: "CHAR_MAX- এ চার্চ মান সেট করা কি CHAR_MIN এর চারপাশে মোড়ানোর গ্যারান্টিযুক্ত?" -> নং
chux - মনিকা 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.