PDA

View Full Version : سوال: چرا این برنامه جواب درست نمیده ؟



saleh.hi.62
شنبه 22 خرداد 1389, 07:15 صبح
چرا این برنامه جواب درست نمیده ؟ جوابی که میده اشتباه !!!


#include <iostream>
using namespace std;

int main() {

float i=8.6;
int *b;
b=reinterpret_cast <int*> (&i);
cout<<*b;
return 0;
}

LORD AELX
شنبه 22 خرداد 1389, 08:41 صبح
برای اینکه شما اومدید آدرس متغیر i رو به integer تبدیل کردید و بعد اونو به اشاره گر b اختصاص دادید! :لبخندساده:

saleh.hi.62
شنبه 22 خرداد 1389, 08:50 صبح
برای اینکه شما اومدید آدرس متغیر i رو به integer تبدیل کردید و بعد اونو به اشاره گر b اختصاص دادید! :لبخندساده:

ممنون دوست عزیز از بابت جوابتون اما !

اگه ما متغییر float داریم و یک اشاره گر int قعدتا ما نمیتونیم با اشاره گر int به متغببر float اشاره کنیم!
راه حل دستور reinterpret_cast که نوع رو تبدیل میکنه !

ولی چرا جواب درست نیست؟

LORD AELX
شنبه 22 خرداد 1389, 09:59 صبح
من متوجه شدم که reinterpret_cast کامپایلر رو وادار می کنه که نوع مقصد رو موقع کامپایل چیز دیگه ای در نظر بگیره. ضمن اینکه با اجرای کد:


#include <iostream>
using namespace std;

int main() {
float i = 8.6;
int* b = reinterpret_cast<int*>(&i);
cout<<"b= "<<b<<" &i="<<&i<<endl;
cout<<*b;
return 0;
}
متوجه میشیم که اشاره گر b در حال اشاره به i هست، ولی جالب اینجاست که خروجی این رو نشون نمیده! :متفکر:


http://www.irupload.ir/images/woersfndaxjs4hgjy6n1.jpg


من میخوام بدونم reinterpret_cast داره دقیقا چه کاری انجام میده...

saleh.hi.62
شنبه 22 خرداد 1389, 12:11 عصر
من میخوام بدونم reinterpret_cast داره دقیقا چه کاری انجام میده...

همین طور که گفتم وقتی ما یک متغییر داریم مثل
float i
و یک اشاره گر داریم مثل
int *j
حالا کاملا مشخصه که اشاره گر j نمیتونه به متغییر i که نوعش متفاوت هست اشاره کنه !
اینجاست که این reinterpret_cast این تبدیل رو باید انجام بده ولی نمیدونم چرا انجام نمیده !!!

saleh.hi.62
شنبه 22 خرداد 1389, 14:57 عصر
مشکل برنامه ی شما اینه که میخواهید با float به صورت یک int رفتار کنید یا بر عکس.
اگر توقع دارید که با ;cout<<*b در خروجی عدد 8.6 رو ببنید ، باید بگم که نمیشه.
چون چیدمان بیت های float/double با بیت های دیگر فرق داره.
مثلا اگر این 00001111 رو بخواهیم به صورت یک int یا short یا .... باهش رفتار کنیم ، نتیجه میشه ، 15 .
ولی اگر به صورت float یا double بخواهیم باهاش رفتار کنیم ، نتیجه میشه 1.74462e-039 .

حرف شما کاملا منطقی اما پس کار این تابع چی؟ reinterpret_cast

به اینجا یه نگاه بندازین:
http://msdn.microsoft.com/en-us/library/e0w9f63b(VS.80).aspx