PDA

نسخه کامل مشاهده نسخه کامل : چرا محدوده ی int در زبان سی بین 127تا -128 است



pishan96
04-12-2017, 02:58
میخواستم بدونم int که علامتدار هست و بیت علامت در مثبت که صفره بزرگترین عدد دو بتوان هفت منهای یک یعنی 127میشه ولی عدد-128 چطوری بدست میاد؟

pishan96
04-12-2017, 20:03
کسی نمیدونه؟؟؟:(

kenzu
04-12-2017, 20:49
از سیستم مکمل 2 استفاده میکنه.

128 منفی میشه 10000000 . چون بیت علامت تغییر نمیکنه محدوده پایین میشه همون منفی 128
128 مثبت هم میشه 10000000 ولی چون بیت علامت باید صفر باشه تو اعداد مثبت محدوده بالا رو 127 در نظر میگیره.

pishan96
05-12-2017, 19:22
از سیستم مکمل 2 استفاده میکنه.

128 منفی میشه 10000000 . چون بیت علامت تغییر نمیکنه محدوده پایین میشه همون منفی 128
128 مثبت هم میشه 10000000 ولی چون بیت علامت باید صفر باشه تو اعداد مثبت محدوده بالا رو 127 در نظر میگیره.
از راهنماییتون ممنونم ،وقتی هشت بیت داریم و میدونیم که مقدار علامتدار هست چطوری ازش -128 رو بدست میاریم و از چی مکمل دو میگیریم

kenzu
05-12-2017, 20:50
از راهنماییتون ممنونم ،وقتی هشت بیت داریم و میدونیم که مقدار علامتدار هست چطوری ازش -128 رو بدست میاریم و از چی مکمل دو میگیریم
از 128 مکمل دو بگیری میشه (10000000) که برابره با -128 .
عددهای بالاتر از 128 رو هم خودت میتونی تست کنی میبینی که علامت تغییر میکنه . پس محدودش همون 127 تا -128 میشه .

n00b
05-12-2017, 22:05
از راهنماییتون ممنونم ،وقتی هشت بیت داریم و میدونیم که مقدار علامتدار هست چطوری ازش -128 رو بدست میاریم و از چی مکمل دو میگیریم
**********************
سلام.../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
****************************
همون طور که دوست عزیزمون گفتند از روش مکمل دو استفاده میشه.../// ولی اینکه از کجا و به چه صورت به این روش رسیدن داستانش طولانی هست../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
**************************
اولاً محدوده ای که ذکر کردید برای اعداد byte هست و int محدوده ی بزرگتری رو داره../// هر بایت معادل 8 بیت هست که هر کدوم می تونن عدد صفر یا یک رو ذخیره کنند// پس تمام حالت هایی که می تونن به وجود بیارن 2×2×2×2×2×2×2×2 حالت یا 2 به توان 8 حالت که میشه 256 تا.../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
**********************************
پس یعنی حداکثر 256 عدد رو میشه داخل 8 بیت ذخیره کرد../// که اگر از صفر شمارش کنیم 256 امین عدد میشه 255.../// پس یعنی اعداد 0 1 2 ... 254 255 رو میشه داخل 8 بیت ذخیره کرد../// البته در صورتی که شمارش رو از صفر شروع کنیم و همه ی اعداد رو مثبت (بدون علامت) در نظر بگیریم../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
*******************************
در صورتی که اعداد رو علامت دار در نظر بگیریم همون طور که خودتون عرض کردید 1 بیت رو به عنوان علامت در نظر می گیریم// در صورتی که بیت علامت برابر صفر باشه عدد مثبت و یک نمایانگر عدد منفی هست../// اینجا هم فرقی نمی کنه هنوز 256 عدد رو می تونیم داخل این 8 بیت ذخیره کنیم.../// در صورتی که شمارش رو از 128- شروع کنید در نهایت بعد از شمارش صفر به عدد 127 میرسید.../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
****************************
فرض کنید همون طور که عرض کردید 1 بیت رو به علامت و 7 بیت رو به عدد اختصاص بدیم../// در اینصورت اگر اعداد رو فقط به مبنای دو تبدیل کنیم عدد صفر برابر 0000 0000 و عدد یک برابر 0001 0000 و عدد دو برابر 0010 0000 و عدد سه برابر 0011 0000 و ... میشه و در نهایت عدد 127 برابر 1111 0111 میشه../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
*********************************
از طرفی برای نمایش اعداد منفی بیت علامت رو هم روشن می کنیم و عدد صفر برابر 0000 1000 و عدد منفی یک برابر 0001 1000 و عدد منفی دو برابر 0010 1000 و ... و در نهایت عدد 127- میشه 1111 1111.../// اما مشکلی که هست اینه که برای نمایش صفر دو شکل مختلف وجود داره(0000 0000 و 0000 1000) که باعث به وجود اومدن یه سری مشکلاتی میشه مثلاً محاسبات پیچیده میشه و باید هر دو نمایش عدد صفر رو داخل مدار ها در نظر گرفت و اینکه می تونیم یکی از نمایش ها رو (مثلاً 0000 1000) به یه عدد دیگه مثل 128- اختصاص بدیم تا محدوده ی بزرگتری داشته باشیم.../// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
*******************************
راه حل استفاده از روش مکمل دو هست و روش محاسبش تو کامپیوتر به این شکل هست که اول مکمل عدد محاسبه میشه (صفر ها تبدیل به یک و یک ها تبدیل به صفر میشن//) و حاصل با عدد یک جمع میشه/// برای مثال عدد 1 برابر 0001 0000 هستش و مکمل عدد یک برابر میشه با 1110 1111 و مجموعش با یک میشه 1111 1111 یعنی مکمل دو عدد 1 (0001 0000) برابر میشه با (1111 1111) که برای نمایش عدد 1- ازش استفاده می کنیم.../// و عدد 127 (1111 0111) که اگه مکمل دو این عدد رو محاسبه کنیم حاصل برابر میشه با 0001 1000 که برای نمایش عدد 127- ازش استفاده می کنیم../// و عدد 128 که در مبنای 2 میشه 0000 1000 و مکملش برابر میشه با 1111 0111 و وقتی با یک جمع بشه مکمل دو برابر میشه با 0000 1000 که برای نمایش عدد 128- ازش استفاده می کنیم.../// همین طور که می بینید مشکل دو نمایش برای عدد صفر حل میشه../// و نمایش دوم عدد صفر که تو روش قبل برابر میشد با 0000 1000 حالا برای نمایش عدد 128- استفاده میشه..//// علاوه بر حل مشکل صفر// اگر اعداد منفی رو به این شکل ذخیره کنیم مدار های محاسباتی هم ساده تر میشن و....///// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
**************************

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
***********************
ببخشید یکم طولانی شد سعی کردم خلاصه و ساده توضیح بدم// روش های دیگه ای هم برای نمایش اعداد منفی وجود دارن که از ذکرشون صرف نظر کردم/// اگر علاقه دارید می تونید تحقیق کنید اینجوری سیر تکاملی رو بهتر متوجه میشید..//// [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
*******************
موفق باشید! [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

*************************
دوست عزیزمون kenzu امیدوارم پوزش بنده رو بپذیرید// پست جدیدتون رو بعد از نوشتن متن بالا دیدم../// :»