PDA

View Full Version : سوال: رسما غیر ممکنه...(128- در یک بایت علامت دار...)



...StacK...
چهارشنبه 16 بهمن 1387, 03:43 صبح
سلام دوستان

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

از 128- تا 127 رو قرار بدیم.......:متفکر::متفکر::متفکر :

به نظر من قرار دادن عدد 128- در یک بایت غیر ممکنه به دلیل زیر:

ما برای نمایش عدد باینری 128 به 8 بیت نیاز داریم و برای علامت اون هم 1 بیت

که در کل میشه 9 بیت که در این صورت این عدد در دو بایت ذخیره میشه که مکمل 2

این عدد به صورت زیر هست:


1111111110000000

که این عدد در 2 بایت ذخیره میشه .

پس نتیجه میگیریم یک بایت علامت دار میتونه از 127- تا 127 رو در خودش ذخیره کنه....

هر کسی نظری مخالف با این نظریه من داره لطفا بیان کنه تا اگر اشتباه میکنم بهش پی ببرم

hoax3r
چهارشنبه 16 بهمن 1387, 11:26 صبح
سلام

تا جایی که من اطلاع دارم مطلبی که گفتین اشتباه هست. بیت علامت همیشه آخرین بیت عدد هست
به این معنی که اگر عدد 1 بایتی هست نباید اون بیت رو جدا در نظر بگیرین که در عدد تبدیل به 9 بیت بشه

عدد 128- در مبنای دو این میشه:


10000000

...StacK...
چهارشنبه 16 بهمن 1387, 17:35 عصر
سلام

تا جایی که من اطلاع دارم مطلبی که گفتین اشتباه هست. بیت علامت همیشه آخرین بیت عدد هست
به این معنی که اگر عدد 1 بایتی هست نباید اون بیت رو جدا در نظر بگیرین که در عدد تبدیل به 9 بیت بشه

عدد 128- در مبنای دو این میشه:


10000000


کاملا بی اساس هست این حرف شما

طبق گفته ی شما پس عدد باینری زیر :


11111111 برابر با 255- هست, که این کاملا بی اساس هست...

توصیه میکنم به مطالبم در پست اول و نمایش اعداد منفی در مکمل 2 مطالعه کنید.

linux
چهارشنبه 16 بهمن 1387, 20:48 عصر
کاملا بی اساس هست این حرف شما

طبق گفته ی شما پس عدد باینری زیر :


11111111 برابر با 255- هست, که این کاملا بی اساس هست...

توصیه میکنم به مطالبم در پست اول و نمایش اعداد منفی در مکمل 2 مطالعه کنید.

:) البته مونده تا کی اساس را معین کند.
در یک بایت علامت دار ، بیت 8 نشان علامت هست.
یعنی
1111 1111 = -127 هست نه -255 و 0000 1000 برابر -128 هست.
128 را در یک بایت علامت دار نمیشه نشوند داد باید دوتا بایت گرفت.
پس عدد 128 علامت دار بصورت زیر نمایش داده خواهد شد.
بایت اول بایت دوم
------------ -----------
0000 1000 0000 0000

زحمت می کشی و می خوانی خوب با دقت بخوان.

...StacK...
چهارشنبه 16 بهمن 1387, 23:20 عصر
:) البته مونده تا کی اساس را معین کند.
در یک بایت علامت دار ، بیت 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 هست.



پس زیاد هم فرقی نمیکنه که کی اساس رو معین کنه.:لبخندساده:

hoax3r
چهارشنبه 16 بهمن 1387, 23:44 عصر
خوب حرف من بی اساس است این جمله ای هست که از مستندات اینتل برداشتم ببینید اینم بی اساس است؟

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-

...StacK...
پنج شنبه 17 بهمن 1387, 00:27 صبح
در ضمن 11111111 هم میشه 1- در یک بایت علامت دار و 255 در یک بایت بدون علامت.(درسته)

========================================

من قبول دارم 127- در یک بایت جا میشه. چرا؟ چون وقتی 127 رو مکمل 2 میکنیم در 8 بیت جا میشه

و اون 8 بیت که مکمل 2 شده و در یک بایت علامت دار جا شده حکم عدد دسیمال 127- را داره.

ولی میگم 128- جا نمیشه ؟چرا ؟چون مکمل 2 عدد 128 در یک بایت جا نمیگیره؟؟؟

اگر اینجور باشه....پس 255- منفی هم در یک بایت جا میگیره .

من از شما میخوام این مسئله رو شرح بدید.

hoax3r
پنج شنبه 17 بهمن 1387, 07:48 صبح
در یک بایت علامت دار و 255 در یک بایت بدون علامت.(درسته)

بله، درسته


من قبول دارم 127- در یک بایت جا میشه. چرا؟ چون وقتی 127 رو مکمل 2 میکنیم در 8 بیت جا میشه

و اون 8 بیت که مکمل 2 شده و در یک بایت علامت دار جا شده حکم عدد دسیمال 127- را داره.

ولی میگم 128- جا نمیشه ؟چرا ؟چون مکمل 2 عدد 128 در یک بایت جا نمیگیره؟؟؟

اگر اینجور باشه....پس 255- منفی هم در یک بایت جا میگیره .

من از شما میخوام این مسئله رو شرح بدید.

اول یک سوال می پرسم به نظرت چرا در اعداد یک بایتی و در اون بازه نمیتونی 128 مثبت داشته باشی؟

من الان مکمل دو عدد 128 رو اینجا حساب میکنم، که دقیقا در یک بایت جا گرفت


+128 : 10000000
reverse : 01111111
+ 1 : 10000000


128+ = 128- جالبه نه!

من فکر میکنم در دستی حساب کردنش مشکل داشته باشین وگرنه چیز خیلی پیچیده ای نیست

shask00l
پنج شنبه 17 بهمن 1387, 10:04 صبح
دارم اسمبلی رو شروع میکنم که گفته در یک بایت علامت دار ما میتونیم


چه کسی گفته ؟

...StacK...
پنج شنبه 17 بهمن 1387, 15:47 عصر
بله، درسته



اول یک سوال می پرسم به نظرت چرا در اعداد یک بایتی و در اون بازه نمیتونی 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- هم در یک بایت جا میگیره. !!!!

hoax3r
پنج شنبه 17 بهمن 1387, 17:31 عصر
به این خاطر که خود عدد 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 بایت نشون داد

...StacK...
پنج شنبه 17 بهمن 1387, 18:31 عصر
من هر حرفی زدم با دلیل بود

و گفته ی اینتل رو هم طبق مکمل 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

دلیل این موضوع چیه؟؟؟

...StacK...
پنج شنبه 17 بهمن 1387, 18:54 عصر
به احتمال 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 هم صادق هست .

اگر کسی نظری مخالف به این موضوع داره بیان کنه..........

hoax3r
پنج شنبه 17 بهمن 1387, 19:47 عصر
درسته اینا همه قرار دادی هست اگه قراره برای این پردازنده برنامه نویسی کنید مجبورید این
قوانین رو رعایت کنید و اگر قبولشون ندارید اون دیگه مساله ی دیگه ای هست

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

در این مورد هم باید جایی بری که این استاندارد ها رو تعیین کرده کتابا هر چیزی میتونن بنویسن
مثلا کتابی که دنیس ریچی (خالق سی) نوشته اینو میگه



INT_MAX 32767 maximum value of int
INT_MIN -32767 minimum value of int


یا در استاندارد ISO/IEC 9899:1999 هم اگه بگردی همینو میبینی پس زیاد اعتباری به کتابا نیست
مراجع مهمن