قرار دادن ادرس یک متغیر double در متغیر int و تغییر مقدار double - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

قرار دادن ادرس یک متغیر double در متغیر int و تغییر مقدار double

+1 امتیاز

سلام دوستان

چرا وقتی ادرس یک متغییر double را از طریق cast کردن در یک متغییر int قرار میدیم نمیشه مقدار double را تغییر داد؟

مثلا کد زیر:

int  *x;
    double d=2;
    x = (int *)&d;
    cout << d << " | " <<&d << " | " << x <<  " | " << *x << " | " << &x << endl;
    *x = 5;
    cout << d << " | " <<&d << " | " << x << " | " << *x << " | " << &x << endl;

 چرا با دستور  *x = 5  مقدار d تغییر نمی کند؟

 

سوال شده فروردین 22, 1393  بوسیله ی moh3en (امتیاز 209)   15 28 40
دوباره تگ گذاری شد فروردین 22, 1393 بوسیله ی BlueBlade

2 پاسخ

+4 امتیاز
 
بهترین پاسخ

سلام .

باید به چند تا چیز توجه کنی :

۱ ) یک double درواقع ۶۴-بیتی هست . ولی int در واقع ۳۲-بیتی هست .

۲ ) یک double داده های متفاوتی نسبت به یک int یا متغییرهای معمولی دیگه داره و از این استاندارد ( IEEE 754 ) پیروی میکنه .

اولین موضوع یعنی اینکه شما یک double رو به int تبدیل میکنی در حقیقت میتونی ۳۲-بیت اول متغییر double رو تغییر بدی .

دومین موضوع هم که واضحه . مقدار داخل double رو به صورت دستی به 5 تغییر میدی . نباید توقع داشته باشی که همون 5 رو به شما نمایش بده چون ساختار double کلا فرق میکنه .

پاسخ داده شده فروردین 22, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد مرداد 17, 1393 بوسیله ی BlueBlade
+3 امتیاز

کد بالا درست کار نمی کنه چون شما داری قواعد Strict aliasing توی C/c++ رو رعایت نمی کنی و کد بالا undefined هستش.

این قاعده بصورت خلاصه اینه که  وفتی که 2 تا پوینتر از نوع متفاوت داری زمانی که از * استفاده میشه مقدارشون هیچ وقت به یک محل از حافظه اشاره نمی کنه

بّرای همین این کد کار نمیکنه  و کامپایل نمیشه :

    int* foo;
    double* bar;
    foo=bar;

وقتی که شما به اون شکل تبدیل می کنی این قاعده رو نقض می کنی برای همین  برنامتون نتیجش مشخص نیست .

پاسخ داده شده فروردین 22, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...