PDA

View Full Version : سوال: مشکل با خطای سرریز



ameysams
یک شنبه 25 مهر 1389, 22:32 عصر
با سلام خدمت من کد زیر را در TC3 تحت داس نوشتم ولی خروجی آن نا مربوط است:

int main()
{
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<sum;
getch();
return 0;

}
خروجی -1356 است در صورتی که باید 64000 باشد ،می دانم که سرریز رخ داده ولی چرا؟ من که sum را از نوع long گرفتم؟؟ باتشکر

tdkhakpur
دوشنبه 26 مهر 1389, 11:12 صبح
محاسبه درسته فقط تبدیلات رو مد نظر نگرفتید.


int main()
{
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<(unsigned long int)sum;
getch();
return 0;
}

در ضمن سرریز به هنگام عملیاتی مانند جمع و تفریق و ضرب صورت نمیگره.

mohsensaghafi
دوشنبه 26 مهر 1389, 18:26 عصر
محاسبه درسته فقط تبدیلات رو مد نظر نگرفتید.


int main()
{
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<(unsigned long int)sum;
getch();
return 0;
}

در ضمن سرریز به هنگام عملیاتی مانند جمع و تفریق و ضرب صورت نمیگره.

سلام دوست عزیز.
سرریز در تمامی عملیات هایی که امکان بوجود آمدن کری را داشته باشد ممکن است رخ دهد.
موفق و پیروز

r00tkit
دوشنبه 26 مهر 1389, 19:14 عصر
هر چند ممکنه سرریزی در کد بالا به خاطر انداره هایی int و long در محیط trubo c رخ داده این اندازه ها به خیلی چیزا بستگی داره ،تو VS2010 رخ نداد



کی گفته سرریزی تو جمع و ... اتفاق نمی افته ؟؟

Salar Ashgi
دوشنبه 26 مهر 1389, 20:01 عصر
ببینید کامپایلر Turbo دیگه واقعا پوسیده شده ، باید Update بشید به یکسری کامپایلرهای بهتر ، کاملتر و
جدیدتر !
من در کامپایلر Borland تست کردم و مشکلی بوجود نیومد :


#include <iostream>
#include <conio>
int main(){
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<sum;
getch();
}

Mokhless
دوشنبه 26 مهر 1389, 20:53 عصر
سلام دوست عزیز.
سرریز در تمامی عملیات هایی که امکان بوجود آمدن کری را داشته باشد ممکن است رخ دهد.
موفق و پیروز

حق با شماست ولی تا جایی که من میدونم توی سی سرریز هایی از این دست نادیده گرفته میشن !

ameysams
دوشنبه 26 مهر 1389, 23:03 عصر
محاسبه درسته فقط تبدیلات رو مد نظر نگرفتید.


int main()
{
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<(unsigned long int)sum;
getch();
return 0;
}
در ضمن سرریز به هنگام عملیاتی مانند جمع و تفریق و ضرب صورت نمیگره.
اولاً ممنون از جوابتون
ٍثانیاً اجرای کد شما این خروجی را به من داد:4294965760
ثالثاً من sum را از نوع long تعریف کردم و long هم تا میلیارد را قبول میکند با این وجود چه نیازی به تبدیل مجدد است؟؟؟
با تشکر مجدد

ameysams
دوشنبه 26 مهر 1389, 23:07 عصر
ببینید کامپایلر Turbo دیگه واقعا پوسیده شده ، باید Update بشید به یکسری کامپایلرهای بهتر ، کاملتر و
جدیدتر !
من در کامپایلر Borland تست کردم و مشکلی بوجود نیومد :


#include <iostream>
#include <conio>
int main(){
int num1,num2;
long int sum;
num1=32000;
num2=32000;
sum=num1+num2;
cout<<sum;
getch();
}


چون حد نهایی متغیری از نوع int در borland خیلی بیشتر از tc3 است
tc3=32700
borland5.02:2147483648
ارادتمند شما

tdkhakpur
سه شنبه 27 مهر 1389, 11:23 صبح
سلام دوست عزیز.
سرریز در تمامی عملیات هایی که امکان بوجود آمدن کری را داشته باشد ممکن است رخ دهد.
موفق و پیروز
درسته من فکرم به پشته رفت.(این کلمه سرریز خیلی جاها منظور اعمال خطای محاسباتی هست به همین دلیل کلمه سرریز برای عملیات محاسباتی میشه گفت یه کمی اشتباهه.)

Salar Ashgi
چهارشنبه 28 مهر 1389, 10:09 صبح
چون حد نهایی متغیری از نوع int در borland خیلی بیشتر از tc3 است

دقیقا ، خوب پس چرا Switch نمی کنید به Turbo ؟!

ameysams
پنج شنبه 29 مهر 1389, 23:12 عصر
ما هنوز منتظریم:متفکر:

Salar Ashgi
پنج شنبه 29 مهر 1389, 23:50 عصر
ما هنوز منتظریم

راه حل اصلی برای مشکل شما ، بیان شد : تغییر کامپایلر !
حالا باز مشکل کجاست ؟!

ameysams
جمعه 30 مهر 1389, 02:35 صبح
راه حل اصلی برای مشکل شما ، بیان شد : تغییر کامپایلر !
حالا باز مشکل کجاست ؟!
این کد را در borland 5.02 بنویسید:(آخرین عددی که int قبول میکنه را بده)

#include<iostream.h>
#include<conio.h>
int main(){
int num1,num2;
long int sum;
num1=2147483647;
num2=2147483647;
sum=num1+num2;
cout<<sum;
getch();
}
به من داد -2
منظورم اینه که چرا با اینکه ما در کد num1وnum2 را از نوع int و جواب را از نوع long گرفتیم چنین مشکلی باید بروز کند؟؟همین!!!:متفکر:

Salar Ashgi
جمعه 30 مهر 1389, 07:39 صبح
منظورم اینه که چرا با اینکه ما در کد num1وnum2 را از نوع int و جواب را از نوع long گرفتیم چنین مشکلی باید بروز کند؟؟همین!!!
ببینید ، پس مثل اینکه شما به پست های قبل توجه نکردید !
ما گفتیم هر متغیری یک Range ای رو ساپورت میکنه و هنگام انجام یک عملی خاص ، مثلا جمع ، اگر نتیجه
در خارج از محدوده متغیر مورد نظر باشد ، خطای سرریز بوجود خواهد بود و یک مقدار منفی نشان داده
خواهد شد که الزاما و طبیعتا برابر با نتیجه مورد نظر ما نیست !

milad36_cpp
جمعه 30 مهر 1389, 12:12 عصر
این کد را در borland 5.02 بنویسید:(آخرین عددی که int قبول میکنه را بده)
دوست عزیز لازم نیست که بیای اینقدر جمع و تفریق کنی ببینی که هر متغییر چه Rangeی داره.
شما با استفاده از sizeof اندازه ی هز متغییر رو بر حسب Byte بدست بیار اونوقت میتونی به راحتی بفهمی.
مثلا اگر ( sizeof( int عدد 2 رو برگردوند .
هر Byte میتونه 256 تا حالت داشته باشه.

65536 = 256 * 256
سپس : رنج متغییر unsigned int میشه : از 0 تا 65535 .

65536 = 256 * 256
32768 = 2 / 65536
سپس : رنج متغییر signed int یا همون int میشه : از 32768- تا 32767.