توصیه شده, آموزش, مقاله های سیسوگ

اهمیت تئوری و ریاضیات در برنامه‌نویسی قسمت دوم: کری یا سرریز، کدام؟

اهمیت تئوری و ریاضیات در برنامه‌نویسی

در قسمت اول این مجموعه از مقالات، سیستم مکمل 2 را که همه‌ی ما از دوران دانشگاه از درس مدار منطقی با آن آشنا هستیم، به خوبی واکاوی کردیم و از خاصیتی نهفته در دل این سیستم پرده برداشتیم و مفصلا توضیح دادیم که این خاصیت نهفته چه کاربردی می‌تواند داشته باشد. همچنین در نهایت یک مثال را در میکروکنترلر AVR که رجیسترهای این نوع از میکروکنترلرها 8 بیتی هستند، بررسی کردیم و ادعای خود مبنی بر همان خاصیت نهفته در دل سیستم متمم 2 رابه اثبات رساندیم.

در قسمت قبل یکی از دوستان با ادمین کانال تلگرام سیسوگ مرتبط شدند و اشاره کردند که اسم این خاصیت که سیستم متمم 2 را منحصر به فرد کرده است، wraparound نام دارد. بله این دوست عزیز درست فرمودند و اسم این خاصیت مهم wraparound نام دارد. اما ما چون می‌خواستیم همین موضوع را بیشتر توضیح داده و البته موضوعی دیگر را نیز بیان کنیم، صبر کردیم تا در این قسمت موضوعی دیگر را بیان کنیم و در قسمت بعد، از تر کیب این دو موضوع مثالی کاربردی‌تر و البته بسیار جذاب، برای شما ارائه بدهیم.

شاید برای شما مفید باشد: آموزش FPGA

این مقاله هم مانند مقاله قسمت قبل به نکته‌ای نهفته در درون اعداد اشاره می‌کند و یک اشتباهی که نه تنها دانشجویان، بلکه بسیاری از افراد با تجربه در حوزه الکترونیک نیز تکرار می‌کنند را یادآور می‌شود.

آیا بین کری (carry) و سرریز (overflow) تفاوتی وجود دارد؟

شاید بنا به یک دلیل بعضی افراد فکر کنند که بین این دو پارامتر هیچ تفاوتی وجود ندارد، اما این دلیل به کجا برمی‌گردد؟ اگر به خاطر داشته باشید اولین بار در درس مدار منطقی سیستم اعداد بدون علامت به ما آموخته شده است، در این سیستم هیچ تفاوتی بین کَری و سرریز وجود نداشت و می‌گفتیم هر موقع کری داشته باشیم سرریز رخ داده است یا اینکه کری و سریز یکی هستند. بعد از آن، سیستم علامت و مقدار و بقیه‌ی سیستم‌های علامت‌دار به ما آموخته شد، مسئله همینجا پیش می‌آید، حال در سیستم اعداد علامت‌دار آیا کری و سرریز یکی هستند؟

خیر، در سیستم اعداد علامت‌دار کری و سرریز یکی نیستند و شاید دلیل این اشتباه که بعضی از افراد فکر می‌کنند در سیستم اعداد علامت‌دار این دو پارامتر یکی هستند این باشد که هنگامی که درس مدار منطقی را می‌گذراندند، وقتی از سیستم اعداد بدون علامت گذر کردند و به سیستم اعداد علامت‌دار رسیدند، به آن‌ها تعریف جدید گفته نشد و همان تعریف قبلی را به سیستم اعداد علامت‌دار نیز تعمیم دادند که خود اشتباه است و یا اگر گفته شد خیلی سطحی و سرسری بیان شد، چون اگر این موضوع به خوبی بیان می‌شد و گفته می‌شد که چه کاربردی دارد، تقریبا محال ممکن است که افراد به اشتباه فکر کنند در سیستم اعداد علامت‌دار هم کری وسرریز یکی هستند.

به طور کلی در سیستم اعداد علامت‌دار کری و سرریز با هم فرق دارند و صرفا وجود کری نمی‌تواند نشان‌دهنده‌ی این باشد که سرریز رخ داده است، همانطوری که نبودن کری نیز نمی‌تواند مشخص کند که سرریزی رخ نداده است، اما ممکن است که در حالت‌هایی هم این دو پارامتر یکی باشند. در ادامه به بررسی دقیق‌تر این موضوع خواهیم پرداخت.

رابطه بین کری و سرریز در سیستم اعداد متمم 2

برای اینکه بتوانیم این موضوع را در سیستم اعداد علامت‌دار شرح بدهیم، سیستم متمم 2 که تا به امروز بهترین و بهینه‌ترین سیستم شناخته‌شده در نمایش اعداد در دیجیتال می‌باشد را انتخاب کردیم. در سیستم اعداد متمم 2، در رابطه با کری و سرریز، چهار حالت ممکن است به وجود بیاید که به تشریح هر کدام از این حالت‌ها به صورت دقیق خواهیم پرداخت. اما قبل از آن اجازه بدهید به تنها حالت ممکن که در سیستم اعداد بدون علامت وجود دارد بپردازیم.

کری و سرریز در اعداد بدون علامت

فرض کنید می‌خواهیم دو عدد بدون علامت 3 بیتی را با هم جمع کنیم، اعداد 4+ و 5+ را در نظر می‌گیریم. طبق تصویر زیر آن‌ها را با هم جمع می‌کنیم.

تفاوت بین کری و سرریز

همانطور که از تصویر بالا مشخص است چون جمع نهایی در محدوده نبوده است، سرریز رخ داده است و بیت کری هم داریم.

به طور کلی در سیستم اعداد بدون علامت اگر قرار باشد سرریز رخ بدهد، همیشه وجود بیت کری نشان‌دهنده‌ی رخ دادن سرریز است و حالت دیگری وجود ندارد.

حال با این توضیحات سراغ مثال‌هایی در سیستم متمم 2 می‌رویم تا نشان دهیم که وجود یا عدم وجود کری به هیچ وجه نمی‌تواند نشان‌دهنده‌ی وجود سرریز باشد.

به این نکته توجه کنید وقتی می‌خواهید عددی را در سیستم متمم 2 نمایش دهید، باید حتما از قبل عرض بیت مشخص باشد چون در غیر این صورت اشتباهاتی رخ خواهد داد.

در مثال‌های زیر ما عرض بیت را 3 بیت تعیین کردیم، یعنی محدوده اعدای که با این تعداد بیت می‌توانیم نمایش بدهیم از 4- تا 3+ می‌باشد.

نه کری داریم و نه سرریز رخ داده است

تفاوت بین کری و سرریز

خب در این حالت اتفاق خاصی نیفتاده است و دو عدد طبق روال معمول باهم جمع شده‌اند.

کری داریم ولی سرریز رخ نداده است

تفاوت بین کری و سرریز

در تصویر بالا کری وجود دارد، اما همانطور که گفتیم صرفا وجود کری نمی‌تواند مشخص کند که سرریزی رخ داده است یا خیر.

کری نداریم اما سرریز رخ داده است

تفاوت بین کری و سرریز

در تصویر بالا کری وجود ندارد، اما می‌دانیم که جمع این دو عدد در محدوده‌ی قابل نمایش توسط 3 بیت نمی‌گنجد و سرریز رخ داده است.

هم کری داریم و هم سرریز رخ داده است

تفاوت بین کری و سرریز

در تصویر بالا کری وجود دارد، سرریز نیز رخ داده است، این حالت مشابه با اعداد بدون علامت می‌باشد که وجود کری مشخص‌کننده‌ی رخ دادن سر ریز است. اما در نظر بگیرید که این حالت، فقط یک حالت از چهار حالت ممکن می‌باشد و صرفا وجود کری نمی‌تواند مشخص کند که سرریز رخ داده است یا خیر.

پس تا اینجا متوجه شدید که جز در حالتی خاص کری و سرریز هیچ ارتباطی با همدیگر ندارند و دو چیز جدا از هم هستند. اما بهتر است که دو تعریف کلی و مجزا برای این دو پارامتر ارائه بدهیم تا در فهمیدن و تشخیص این موارد دچار اشتباه و سردرگم نشویم.

اگر حاصل جمع دو عدد n بیتی را در n+1 بیت ذخیره کنیم، آنگاه بیت n+1 همان کری می‌باشد.
اگر حاصل جمع دو عدد n بیتی، در n بیت نگنجد یا قابل نمایش دادن نباشد، آنگاه سرریز رخ داده است.

 

اینکه چگونه کری و سرریز را تشخیص بدهیم و چه عملیاتی روی آن‌ها انجام بدهیم تا بتوانیم سرریز را کنترل کنیم، چه مواقعی نیاز به کنترل سرریز نمی‌باشد و اگر نیاز است که کنترل کنیم با چه روش‌هایی و چگونه می‌توانیم سر ریز را کنترل کنیم، روش‌های wrapping و saturation در کنترل سرریز چیست و کلی سوال دیگر از جمله سوالاتی هستند که هم در قسمت سوم پاسخ داده خواهند شد و هم اینکه به صورتی عملی همراه با مثال روی میکروکنترلر یا fpga تست خواهند شد.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

12 دیدگاه در “اهمیت تئوری و ریاضیات در برنامه‌نویسی قسمت دوم: کری یا سرریز، کدام؟

  1. Avatar for رضا رضا گفت:

    سلام
    بسیار عالی بود
    حیف قسمت سوم نیومد

    1. Avatar for Phoenix Phoenix گفت:

      سلام.

      این سبک مقالات را چون خودم خیلی علاقه داشتم و در کل فکر میکنم ارزش هر علمی از جمله برنامه‎نویسی به درک عمیق جزئیات هستش و نه به کار بردن کلیات، شروع به نوشتن کردم. اما خب دیدم به کار کسی نمیاد و استقبالی هم نشد دیگه ادامه ندادم.

      1. Avatar for مهدی مهدی گفت:

        با عرض سلام و خسته نباشید
        خیلی ممنون از آموزش های خوبتون
        ما که دوس داریم این مطالب رو و خیلی هم پیگیریم
        اگه ادامه بدین خیلی ممنون میشیم

  2. Avatar for arash arash گفت:

    با سلام
    مطالب منتشر شده در قسمت آموزش FPGA بسیار نزدیک به آموزش های آموزشگاه فراد اندیش است (حتی ترتیب بیان مطالب) و احساس کپی برداری صد در صدی به خواننده دست می دهد. این در حالی است که به احتمال زیاد، موسس آموزشگاه (آقای ثقفی)، شرعا و قانونا مخالف این روند هستند و از دانش آموختگان دوره طراحی دیجیتال با FPGA ، خواهش اخلاقی مبنی بر عدم کپی برداری کرده بودند.
    ای کاش رعایت اصل کپی رایت را فدای آموزش های رایگان و مفید نکنیم.
    با تشکر

    1. Avatar for Sisoog OS Sisoog OS گفت:

      سلام دوست عزیز
      انتقاد شما کاملا به جا و منطقی هست و اتفاقا دوست دیگه ای هم چنین انتقادی را داشتند
      پیرو این انتقاد و اینکه نویسنده این مطالب نیز از شاگردان جناب مهندس ثقفی هستند با ایشون مرتبط شدند و در مورد این مطالب صحبت کردند که ایشون از اینکه یکی از شاگرداش تونست این مطالب را تا این حد عمیق یاد بگیرند و یاد بدهند خوشحال بود، اما بحث نحوه ارائه و سایر موارد انشاله برای اینکه این قضیه برای همه واضح تر بشه با ایشان مفصلا صحبت می‌شود و در صفحه اصلی این آموزشها این مورد بصورت واضح اورده خواهد شد.

  3. Avatar for حسین حسین گفت:

    سلام.
    مطلب خوبی بود .راستش هیچوقت بهش فکر نکرده بودم .
    سپاس.

    1. Avatar for Phoenix Phoenix گفت:

      سلام حسین عزیز. وجودش که تقریبا بدیهی به نظر می‌رسد، اما توجه‌ای به آن نمی‌شود. بیشتر آشکارسازی و کنترل آن مدنظر است.

      1. Avatar for حسین حسین گفت:

        راستش به نظر میاد فقط کری به صورتی سخت افزاری قابل پیگیری هست . و سرریز برای اعداد علامتدار بیشتر یک چیز ذهنی باشه ( چون اساسا اعداد منفی مکمل 2 قرار داد ذهنی هستن )آیا همینطوره یا مثل کری یک بیت هست که 1 میشه؟

        1. Avatar for Phoenix Phoenix گفت:

          برای کری باید بیت n+1ام که به صورت سخت‌افزاری وجود دارد 1 شود. به این صورتی که می‌فرمائید نمی‌توان گفت ذهنی، نهایتا به صورت سخت‌افزاری باید تمهیداتی برای این مورد در نظر گرفته شود، اما خب این امکان وجود دارد که بیتی 1 نشود که شما لزوما با یک شدن آن بیت سرریز را تشخیص بدهید. نه لزوما یک بیت 1 نخواهد شد.

  4. بازتاب: اهمیت تئوری و ریاضیات در برنامه‌نویسی قسمت اول: خواص سیستم متمم 2 - سیسوگ - Sisoog

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *