اطلاعیه

Collapse
No announcement yet.

تعریف unsigned char به جای int

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تعریف unsigned char به جای int

    با سلام به تمامی دوستان
    چرا در برنامه نویسی میکرو(کامپایلر Code Vision) متغیرهایی که مقدارشان صحیح است را معمولا unsigned char تعریف میکنند نه int.البته من خودم int تعریف میکردم اما زیاد دیدم که دیگران unsigned char تعریف میکنند.علتش رو نفهمیدم.مخصوصا اینکه مقدار صحیح چه ربطی به unsigned char داره.
    ممنون میشم راهنمایی ام کنید.
    با سپاس و درود بیکران  
    زیبا باش و بخند بر هرآنچه زشتی است،چرا که تنهاترین شان تو ،زیبایی است.

    #2
    پاسخ : تعریف unsigned char به جای int

    با سلام
    در حالت عادی شما میتونید اعداد منفی رو هم به متغیرتون نسبت بدید
    مثلا در صورتی که متغیر char باشه محدوده ای بین 128- الی 127+ رو پوشش میده اما در صورتی که شما به نوع unsigned char تبدیلش کنید محدودش به 0 الی +255 تغییر پیدا میکنه.

    با سپاس
    نيست بر لوح دلم جز الف قامت دوست *** چه کنم حرف دگر ياد نداد استادم

    دیدگاه


      #3
      پاسخ : تعریف unsigned char به جای int

      با سلام
      یکی از دلایلش می تونه این باشه که unsignedchar هشت بیتیه ولی int شانزده بیت .
      یه جورایی می شه گفت واسه صرفه جویی تو حافظه sram این کار انجام می شه.

      دیدگاه


        #4
        پاسخ : تعریف unsigned char به جای int

        با سلام
        توی AVR 035 هجده نکته برای کاهش حجم کد بیان شده که یکی از موارد همینه ببینید :
        18 نکته برای کاهش حجم کد نهایی :

        1- عمل کامپایل در حالت full size optimization انجام شود.


        2- هر زمان که امکانش وجود داشت به جای استفاده از متغیر های سراسری از متغیر های محلی استفاده شود.

        3- همواره از کوچکترین متغیر متناسب با نوع کار مورد نظر استفاده و در صورت امکان بهتر است که بدون علامت(unsigned) تعریف شود .

        4- بهتر است اگر یک متغیر غیر محلی که تنها داخل یک تابع ارجاع داده شده است به صورت ایستا (static) تعریف گردد .

        5- در صورت امکان دادهای غیر محلی در قالب سختار تعریف شوند این امر امکان اینکه برای آدرس دهی غیر مستقیم اشاره گر به طور مجدد بارگزاری نشود افزایش می دهد .

        6- برای ایجاد حلقه های بی پایان از for( ; ; ) { } استفاده شود .

        7- در صورت امکان برای ایجاد حلقه از سختار do { } while(expression) استفاده شود .

        8- در صورت امکان از حلقه های پایین شمار و با فلگ پیش کاهشی(pre-decrement) استفاده شود.

        9- دسترسی مستقیم به رجیستر های I/O یا به عبارتی عدم استفاده از اشاره گر برای دسترسی به این رجیسترها

        10- اگر تابع main در هیچ کجای برنامه فراخوانی نشده بهتر است که با عنوان "C_task__" تعریف شود :

        __C_task void main(void)
        {

        11- استفاده از ماکروها بجای توابع برای انجام دستورات خاصی که کد اسمبلی معادلشان کمتر از 2 الی 3 خط میشود.

        12- کاهش حجم INTVEC (قسمتی از کد که فهرست بردار های وقفه و ریست را در خود برای استفاده از وقفه ها حفظ می کند مثلا برای مگا 16 که 4 بایت می باشد ) به اندازه مورد نیاز یا اینکه تمام قسمت های کد را یکی کرده تا کامپایلر به طور خودکار از فضای موجود به اندازه نیاز استفاده کند .

        13- کدهایی با قابلیت استفاده مجدد که در قالب ماژلار هستند. جمع آوری چندین تابع در یک ماژول یا به عبارتی در یک فایل و استفاده از آن در برنامه قابلت استفاده مجدد از کد را افزایش می دهند .

        14- برای دسترسی به حافظه داده از اشاره گر ها با یک مقدار آفست استفاده و یا ساختار هایی برای این امر تعریف شوند.

        15- در بعضی مواقع انجام عمل کامپایل در حالت "full speed optimization" منجر به تولید کدهای با حجم کمتر از حالت "full size optimization" میشود برای تشخیص این مسئله عمل کامپایل را بر روی یک ماژول بر مبنای یک ماژول خاص انجام میدهیم و نتیجه هر دو حالت از بهینه سازی را در مورد آن ماژول بررسی میکنیم تا بهترین حالت را برای انجام عمل کامپایل تعیین کنیم .

        16- در صورت امکان از فراخوانی توابع داخل روتین وفقه ها اجتناب شود .

        17- از کوچکترین مدل حافظه ممکن استفاده گردد .

        18- Optimize C_startup to not initialize unused segments (i.e., IDATA0 or IDATA1 if all
        variables are tiny or small).

        دیدگاه


          #5
          پاسخ : تعریف unsigned char به جای int

          [quote author=ساناز.پارســا link=topic=55815.msg299376#msg299376 date=1318359230]
          با سلام
          در حالت عادی شما میتونید اعداد منفی رو هم به متغیرتون نسبت بدید
          مثلا در صورتی که متغیر char باشه محدوده ای بین 128- الی 127+ رو پوشش میده اما در صورتی که شما به نوع unsigned char تبدیلش کنید محدودش به 0 الی +255 تغییر پیدا میکنه.

          با سپاس
          با سلام و سپاس از پاسختان
          اما منظور من اینه که چجوری متغیری که میخواهد مقداری صحیح را برگردونه،با unsigned char تعریف میشه؟مگه char برای تعریف انواع کاراکتر تعریف نشده؟پس چگونه مقادیر صحیح را برمیگردونه؟والا تا آنجا که من میدونم برای مقادیر صحیح باید از int استفاده کرد نه charممنون میشم راهنمایی ام کنید.
          زیبا باش و بخند بر هرآنچه زشتی است،چرا که تنهاترین شان تو ،زیبایی است.

          دیدگاه


            #6
            پاسخ : تعریف unsigned char به جای int

            با سلام
            ببین دوست عزیز شما وقتی یه متغیری رو از نوع unsigned char معرفی میکنی فضایی که این متغیر اشغال میکنه 8 بیته ،حالا این 8 بیتی که در اختیار داری رو میتونی تا عدد 255 پر کنی
            نوشته اصلی توسط amir-ak
            با سپاس
            با سلام و سپاس از پاسختان
            اما منظور من اینه که چجوری متغیری که میخواهد مقداری صحیح را برگردونه،با unsigned char تعریف میشه؟مگه char برای تعریف انواع کاراکتر تعریف نشده؟پس چگونه مقادیر صحیح را برمیگردونه؟والا تا آنجا که من میدونم برای مقادیر صحیح باید از int استفاده کرد نه charممنون میشم راهنمایی ام کنید.
            کاراکتر چطوری ریخته میشه تو حافظه ؟خوب تبدیل به 0 و 1 میشه بعد تو حافظه ریخته میشه دیگه...
            درسته char بره کاراکتر استفاده میشه ولی خوب شما میتونی برای صرفه جویی در فضای حافظه ازش استفاده کنی (البته باید در نظر داشت که محدود هست)
            از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

            دیدگاه


              #7
              پاسخ : تعریف unsigned char به جای int

              البته از اونجایی که ممکنه بنا بر پارامتر های کامپایلر بشه یک char رو بصورت پیشفرض signed یا unsigned کرد اگر رنج عددی مهمه حتما عبارت signed یا unsigned قبل از آوردن نوع char قید بشه. یا اینکه از تایپهای تعریف شده ای مثل uint32_t یا int16_t استفاده بشه. چون این انواع علاوه بر اینکه علامت رو مشخص میکنن حجمشون هم کاملا مشخصه و ربطی به پلاتفرم نداره.

              دومین مسئله هم اینه که خیلی وقتها بهتره در محاسبات و مخصوصا مقایسه ها از نوع unsigned استفاده بشه. مثلا فرض کنیم میخوایین چک کنین که عددی از جنس signed int مقداری بین صفر تا 5 داشته باشه که معمولا این کد نوشته میشه:

              if((n >= 0) && (n <= 5))


              که میشه به فرم دیگه ای هم نوشته بشه که البته یه کمی ناخوانا هست:

              if((unsigned int)n <= 5)


              چون فرم unsigned یک عدد منفی بسیار بزرگتر از عدد 5 میشه.

              دیدگاه

              لطفا صبر کنید...
              X