رسما غیر ممکنه...(128- در یک بایت علامت دار...)
سلام دوستان
دارم اسمبلی رو شروع میکنم که گفته در یک بایت علامت دار ما میتونیم
از 128- تا 127 رو قرار بدیم.......:متفکر::متفکر::متفکر :
به نظر من قرار دادن عدد 128- در یک بایت غیر ممکنه به دلیل زیر:
ما برای نمایش عدد باینری 128 به 8 بیت نیاز داریم و برای علامت اون هم 1 بیت
که در کل میشه 9 بیت که در این صورت این عدد در دو بایت ذخیره میشه که مکمل 2
این عدد به صورت زیر هست:
1111111110000000
که این عدد در 2 بایت ذخیره میشه .
پس نتیجه میگیریم یک بایت علامت دار میتونه از 127- تا 127 رو در خودش ذخیره کنه....
هر کسی نظری مخالف با این نظریه من داره لطفا بیان کنه تا اگر اشتباه میکنم بهش پی ببرم
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
سلام
تا جایی که من اطلاع دارم مطلبی که گفتین اشتباه هست. بیت علامت همیشه آخرین بیت عدد هست
به این معنی که اگر عدد 1 بایتی هست نباید اون بیت رو جدا در نظر بگیرین که در عدد تبدیل به 9 بیت بشه
عدد 128- در مبنای دو این میشه:
10000000
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
نوشته شده توسط
hoax3r
سلام
تا جایی که من اطلاع دارم مطلبی که گفتین اشتباه هست. بیت علامت همیشه آخرین بیت عدد هست
به این معنی که اگر عدد 1 بایتی هست نباید اون بیت رو جدا در نظر بگیرین که در عدد تبدیل به 9 بیت بشه
عدد 128- در مبنای دو این میشه:
10000000
کاملا بی اساس هست این حرف شما
طبق گفته ی شما پس عدد باینری زیر :
11111111
برابر با 255- هست, که این کاملا بی اساس هست...
توصیه میکنم به مطالبم در پست اول و نمایش اعداد منفی در مکمل 2 مطالعه کنید.
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
نوشته شده توسط
...StacK...
کاملا بی اساس هست این حرف شما
طبق گفته ی شما پس عدد باینری زیر :
11111111
برابر با 255- هست, که این کاملا بی اساس هست...
توصیه میکنم به مطالبم در پست اول و نمایش اعداد منفی در مکمل 2 مطالعه کنید.
:) البته مونده تا کی اساس را معین کند.
در یک بایت علامت دار ، بیت 8 نشان علامت هست.
یعنی
1111 1111 = -127 هست نه -255 و 0000 1000 برابر -128 هست.
128 را در یک بایت علامت دار نمیشه نشوند داد باید دوتا بایت گرفت.
پس عدد 128 علامت دار بصورت زیر نمایش داده خواهد شد.
بایت اول بایت دوم
------------ -----------
0000 1000 0000 0000
زحمت می کشی و می خوانی خوب با دقت بخوان.
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
نوشته شده توسط
linux
:) البته مونده تا کی اساس را معین کند.
در یک بایت علامت دار ، بیت 8 نشان علامت هست.
یعنی
1111 1111 = -127 هست نه -255 و 0000 1000 برابر -128 هست.
128 را در یک بایت علامت دار نمیشه نشوند داد باید دوتا بایت گرفت.
پس عدد 128 علامت دار بصورت زیر نمایش داده خواهد شد.
بایت اول بایت دوم
------------ -----------
0000 1000 0000 0000
زحمت می کشی و می خوانی خوب با دقت بخوان.
نقل قول:
1111 1111 = -127 هست نه -255
من هم نگفتم 255-
اگر دقت میکردید گفتم اونجوری که اون دوست عزیزمون گفتنند میشه 255- و من این
مورد رو تایید نکردم .با این حال باعث سو استفاده شما شد.
و در اصل برابر با 255 هست نه 127- ....
عدد 127- برابر با 10000001 هست.
سیستم اعداد منفی رو در مکمل 2 میگم و الا دیگه اعداد منفی معنایی نداشت
وقتی شما عدد 10000001 رو برگشت بدید میشه 01111111 که برابر با 127 هست و
وقتی به مکمل 2 میره میشه 127-
ولی وقتی 128 به مکمل 2 میره تا بشه 128- در یک بایت جا نمیگیره که این موضوع رو
در پست اولم توضیح دادم.
نقل قول:
و 0000 1000 برابر -128 هست.
0000 1000 برابر با 128 هست , نه 128-
نقل قول:
پس عدد 128 علامت دار بصورت زیر نمایش داده خواهد شد.
بایت اول بایت دوم
------------ -----------
0000 1000 0000 0000
من حرفی از عدد 128 علامت دار نزدم. !!!
در واقع ما عددی به نام عدد 128 علامت دار نداریم ...بهتره بگید عدد 128 در بایت علامت دار.
برای نمایش اعداد منفی ما باید اونا رو به مکمل 2 اونا تبدیل کنیم و وقتی عدد 128
را به مکمل 2 تبدیل میکنیم به 9 بیت نیاز خواهیم داشت که در واقع این عدد در 2 بایت
جا میگیره.
مکمل 2 عدد 128 که میشه 128- به صورت زیر هست:
1111111110000000
حالا وقتی شما این عدد رو برگشت بدید میشه
10000000 که برابر با 128 هست.
پس زیاد هم فرقی نمیکنه که کی اساس رو معین کنه.:لبخندساده:
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
خوب حرف من بی اساس است این جمله ای هست که از مستندات اینتل برداشتم ببینید اینم بی اساس است؟
Software Developer's Manual Volume 1 Basic Architecture
4.2.1.2 Signed Integers
Signed integers are signed binary numbers held in a byte, word, doubleword, or
quadword. All operations on signed integers assume a two's complement representation.
The sign bit is located in bit 7 in a byte integer, bit 15 in a word integer, bit 31 in
a doubleword integer, and bit 63 in a quadword integer
The sign bit is set for negative integers and cleared for positive integers and zero.
Integer values range from –128 to +127 for a byte integer, from –32,768 to +32,767
for a word integer, from –231 to +231 – 1 for a doubleword integer, and from –263 to
+263 – 1 for a quadword integer.
میبینید در واقع حرف شما هم تا حدودی درست است اگر مساله رو به این صورت ببینیم
وقتی عدد رو 1 بایت در نظر بگیریم عدد 128- میشه
10000000
اگر عدد 2 بایت باشد :
1111111110000000
اگر 4 بایت باشد :
11111111111111111111111110000000
--------
در ضمن 11111111 هم میشه 1-
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
در ضمن 11111111 هم میشه 1-
در یک بایت علامت دار و 255 در یک بایت بدون علامت.(درسته)
========================================
من قبول دارم 127- در یک بایت جا میشه. چرا؟ چون وقتی 127 رو مکمل 2 میکنیم در 8 بیت جا میشه
و اون 8 بیت که مکمل 2 شده و در یک بایت علامت دار جا شده حکم عدد دسیمال 127- را داره.
ولی میگم 128- جا نمیشه ؟چرا ؟چون مکمل 2 عدد 128 در یک بایت جا نمیگیره؟؟؟
اگر اینجور باشه....پس 255- منفی هم در یک بایت جا میگیره .
من از شما میخوام این مسئله رو شرح بدید.
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
در یک بایت علامت دار و 255 در یک بایت بدون علامت.(درسته)
بله، درسته
نقل قول:
من قبول دارم 127- در یک بایت جا میشه. چرا؟ چون وقتی 127 رو مکمل 2 میکنیم در 8 بیت جا میشه
و اون 8 بیت که مکمل 2 شده و در یک بایت علامت دار جا شده حکم عدد دسیمال 127- را داره.
ولی میگم 128- جا نمیشه ؟چرا ؟چون مکمل 2 عدد 128 در یک بایت جا نمیگیره؟؟؟
اگر اینجور باشه....پس 255- منفی هم در یک بایت جا میگیره .
من از شما میخوام این مسئله رو شرح بدید.
اول یک سوال می پرسم به نظرت چرا در اعداد یک بایتی و در اون بازه نمیتونی 128 مثبت داشته باشی؟
من الان مکمل دو عدد 128 رو اینجا حساب میکنم، که دقیقا در یک بایت جا گرفت
+128 : 10000000
reverse : 01111111
+ 1 : 10000000
128+ = 128- جالبه نه!
من فکر میکنم در دستی حساب کردنش مشکل داشته باشین وگرنه چیز خیلی پیچیده ای نیست
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
نوشته شده توسط
...StacK...
دارم اسمبلی رو شروع میکنم که گفته در یک بایت علامت دار ما میتونیم
چه کسی گفته ؟
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
نوشته شده توسط
hoax3r
بله، درسته
اول یک سوال می پرسم به نظرت چرا در اعداد یک بایتی و در اون بازه نمیتونی 128 مثبت داشته باشی؟
من الان مکمل دو عدد 128 رو اینجا حساب میکنم، که دقیقا در یک بایت جا گرفت
+128 : 10000000
reverse : 01111111
+ 1 : 10000000
128+ = 128- جالبه نه!
من فکر میکنم در دستی حساب کردنش مشکل داشته باشین وگرنه چیز خیلی پیچیده ای نیست
نقل قول:
اول یک سوال می پرسم به نظرت چرا در اعداد یک بایتی و در اون بازه نمیتونی 128 مثبت داشته باشی؟ اگر منظورتون در یک بایت علامت دار هست
به این خاطر که خود عدد 128 مثبت در 8 بایت جا میگیره و دیگه جایی برای بیت علامت
که اون بیت 0 هست نیست
یعنی این عدد باید در 2 بایت علامت دار ذخیره بشه ....به صورت زیر
0000000010000000
خب شما مکمل 2 عدد 128 رو بدون اضافه کردن بیت علامت حساب کردید
پس در این صورت من هم اگر بخوام مکمل 2 عدد 255 رو حساب کنم به صورت زیر میشه:
255(10)=11111111(2)
11111111
00000000
+1
00000001
پس عدد 255- هم در یک بایت جا میگیره. !!!!
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
نقل قول:
به این خاطر که خود عدد 128 مثبت در 8 بایت جا میگیره و دیگه جایی برای بیت علامت
که اون بیت 0 هست نیست
یعنی این عدد باید در 2 بایت علامت دار ذخیره بشه ....به صورت زیر
0000000010000000
خب شما مکمل 2 عدد 128 رو بدون اضافه کردن بیت علامت حساب کردید
در اعداد با علامت یک بایتی شما مجاز به استفاده از عدد 128 نیستین به دلیل اینکه با 128- یکسان هست
در نتیجه همونطور که گفتین برای نمایش عدد 128 نیاز به دو بایت داریم این به این معنی نیست چون 128
مثبت دو بایته مکمل دوشم باید 2 بایت باشه شما حرفی که از خود اینتل نقل کردم هم قبول ندارید!!
نقل قول:
پس در این صورت من هم اگر بخوام مکمل 2 عدد 255 رو حساب کنم به صورت زیر میشه:
255(10)=11111111(2)
11111111
00000000
+1
00000001
پس عدد 255- هم در یک بایت جا میگیره. !!!!
بازم دارین اشتباه می کنید ما در مورد اعداد یک بایتی با علامت صحبت میکنیم که در بازه 127 تا 128- هستن
پس این 255 رو از کجا آوردین اینو باید تو 2 بایت نشون داد
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
من هر حرفی زدم با دلیل بود
و گفته ی اینتل رو هم طبق مکمل 2 قبول ندارم مگر اینکه این یه موضوع قرار دادی باشه
که اعدادی که بدون اضافه کردن بیت علامت در مکمل 2 برابر با مثبت همان عدد میشن نیازی
به اضافه کردن بیت علامت نیست.(تا اینجا قانع شدم)
و اما در جایی دیگه به این صورت خوندم:
C
The Complete Reference
Fourth Edition
صفحه 56:
range of at least 32,767 to –32,768.
Type
Typical Size in
Bits Minimal Range
char 8 –127 to 127
دلیل این موضوع چیه؟؟؟
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
به احتمال 99 درصد این کتاب و بیشتر کتاب های programming که به این صورت
گفتند اشتباه هست ....چرا؟؟؟ دوباره به همین قسمت از کتاب توجه کنید:
range of at least 32,767 to –32,768.
Type
Typical Size in
Bits Minimal Range
char 8 –127 to 127
در واقع خط اخر از این قسمت , خط اول خودش رو نقض کرده
گفته از 32768- تا 32767 در دو بایت جا میشه در واقع 32768- در دوبایت حکم
128- در یک بایت رو داره , به مکمل 2 این عدد توجه کنید:
32768(10)=1000000000000000(2)
reverse: 0111111111111111 (مکمل 1)
+1 : 1000000000000000 (مکمل 2)
دیدید که مکمل 2 اون با حالت اولیه و مثبت عدد باینری یکی بود
پس هیمن موضوع در مورد 128 هم صادق هست .
اگر کسی نظری مخالف به این موضوع داره بیان کنه..........
نقل قول: رسما غیر ممکنه...(128- در یک بایت علامت دار...)
درسته اینا همه قرار دادی هست اگه قراره برای این پردازنده برنامه نویسی کنید مجبورید این
قوانین رو رعایت کنید و اگر قبولشون ندارید اون دیگه مساله ی دیگه ای هست
و دیگر مطالبی که گفتین و مربوط به زبان سی بود این هم مساله ای جداست هر زبان برنامه نویسی
میتونه قواعد خاص خودش رو داشته باشه پس واقعا ربطی به موضوعی که اول بحث کردین نداره
در این مورد هم باید جایی بری که این استاندارد ها رو تعیین کرده کتابا هر چیزی میتونن بنویسن
مثلا کتابی که دنیس ریچی (خالق سی) نوشته اینو میگه
INT_MAX 32767 maximum value of int
INT_MIN -32767 minimum value of int
یا در استاندارد ISO/IEC 9899:1999 هم اگه بگردی همینو میبینی پس زیاد اعتباری به کتابا نیست
مراجع مهمن