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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

حمایت از سپهر

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

12 دیدگاه

  • رضا
    ۱۵ فروردین ۱۳۹۹

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

    • Phoenix
      ۱۵ فروردین ۱۳۹۹

      سلام.

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

      • مهدی
        ۵ آبان ۱۴۰۰

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

  • arash
    ۲۱ مهر ۱۳۹۸

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

    • Sisoog Os
      Sisoog OS
      ۲۲ مهر ۱۳۹۸

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

  • حسین
    ۱۸ مهر ۱۳۹۸

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

    • Phoenix
      ۲۰ مهر ۱۳۹۸

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

      • حسین
        ۲۵ مهر ۱۳۹۸

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

        • Phoenix
          ۲۸ مهر ۱۳۹۸

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

          • حسین
            ۲۸ مهر ۱۳۹۸

            سپاس.

            0
          • Phoenix
            ۲۸ مهر ۱۳۹۸

            🙏🙏🙏

            0
  • اهمیت تئوری و ریاضیات در برنامه‌نویسی قسمت اول: خواص سیستم متمم 2 - سیسوگ - Sisoog
    ۱۴ مهر ۱۳۹۸

    […] لینک قسمت دوم. […]

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

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

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک