تفاوت بین int و بدون امضا چیست؟


پاسخ 1:

یک مقدار 8 بیتی را در نظر بگیرید.

11111111 احتمالاً توسط بسیاری از افراد به عنوان 255 خوانده می شود.

اما اگر به اعداد منفی احتیاج داریم ، چیز خوبی نیست. یک عدد صحیح 1 بایت امضا شده با الگوی یکسان -1 خواهد بود (مطابق با نمایشگر مکمل استاندارد دو).

وقتی 11111111 را به 00000010 اضافه می کنم ، دریافت می کنم:

111111101 ، این یک ارزش 9 بیتی است. به استثنای اینکه 9 بیت خیلی زیاد است ، بیت 9 از بین می رود. به من بده ... 0001 ، جواب انتظار می رود.

در حالی که حساب بین اضافه کردن شماره های امضا شده و بدون علامت یکسان است ، دلایل مختلفی وجود دارد که چرا کامپایلر و کتابخانه استاندارد باید تفاوت را بدانند:

  • cout برای چاپ مقدار صحیح باید بداند که آیا شماره ای امضا شده یا علامت گذاری نشده است. اگر پرچم های سرریز در CPU وجود داشته باشد ، می توانند هنگام افزودن امضا شده یا بدون امضا ، رفتارهای متفاوتی داشته باشند. کد زیر)

پاسخ 2:

برای همه انواع عدد صحیح ، به استثنای "char" (آیا کاراکتر به طور پیش فرض امضا شده یا بدون امضا است؟) ، وضعیت "استاندارد" یک اظهارنامه "امضا شده" است. (انواع اصلی عدد صحیح در C شارژ ، کوتاه ، داخلی و طولانی است.)

یک int- یا فقط int - امضا شده می تواند حاوی مقادیر منفی باشد ، اما یک int no signified (حداقل بدون ریخته گری) نمی تواند. با این حال ، برای یک int non signified ، بیت اضافی در دسترس است که می تواند مقادیر داده های بزرگتر را در مقایسه با int intigned ذخیره کند زیرا هیچ بیتی برای نشان دادن منفی لازم نیست.

در اکثر سخت افزارهای مدرن 32 بیتی ، جایی که sizeof (int) 4 و BITS_PER_BYTE 8 است ، موارد زیر اعمال می شود:

  • دامنه یک int no sign -2 -2 ^ 31 تا 2 ^ 31 - 1 است. دامنه int intigned 0 تا 2 ^ 32 - 1 است.

اگر به مناطق داده نگران هستید و باید با قابلیت حمل بین معماری های دستگاه مقابله کنید ، باید به جای انواع عدد صحیح اولیه ، از stdint.h از uint32_t و انواع مشابه استفاده کنید.


پاسخ 3:

برای همه انواع عدد صحیح ، به استثنای "char" (آیا کاراکتر به طور پیش فرض امضا شده یا بدون امضا است؟) ، وضعیت "استاندارد" یک اظهارنامه "امضا شده" است. (انواع اصلی عدد صحیح در C شارژ ، کوتاه ، داخلی و طولانی است.)

یک int- یا فقط int - امضا شده می تواند حاوی مقادیر منفی باشد ، اما یک int no signified (حداقل بدون ریخته گری) نمی تواند. با این حال ، برای یک int non signified ، بیت اضافی در دسترس است که می تواند مقادیر داده های بزرگتر را در مقایسه با int intigned ذخیره کند زیرا هیچ بیتی برای نشان دادن منفی لازم نیست.

در اکثر سخت افزارهای مدرن 32 بیتی ، جایی که sizeof (int) 4 و BITS_PER_BYTE 8 است ، موارد زیر اعمال می شود:

  • دامنه یک int no sign -2 -2 ^ 31 تا 2 ^ 31 - 1 است. دامنه int intigned 0 تا 2 ^ 32 - 1 است.

اگر به مناطق داده نگران هستید و باید با قابلیت حمل بین معماری های دستگاه مقابله کنید ، باید به جای انواع عدد صحیح اولیه ، از stdint.h از uint32_t و انواع مشابه استفاده کنید.