PDA

View Full Version : سوال: تبدیل نوع داده



kosar ranjbar
سه شنبه 14 مهر 1388, 18:56 عصر
سلام در بر نامه زیر i و j جوابش چیست ؟
int i
unsigned int j
j=60000
i=j
cout<<i
i=-32
j=i
cout<<j

در اجرا جواب i=1 و جواب j=4294967264 می باشد چگونه تبدیل شده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

deopen
سه شنبه 14 مهر 1388, 20:21 عصر
#include<iostream>
using std::cout;
using std::cin;

#include<windows.h>


int main()
{
int i;
unsigned int j;

i=4294967295;
j=4294967295;
cout<<"i : (4294967295) = "<<i<<"\n\n";
cout<<"j: (4294967295) = "<<j<<"\n\n\n\n";

i=4294967296;
j=4294967296;
cout<<"i : (4294967296) ="<<i<<"\n\n";
cout<<"j: (4294967296) ="<<j<<"\n\n\n\n";

i=4294967297;
j=4294967297;
cout<<"i : (4294967297) ="<<i<<"\n\n";
cout<<"j: (4294967297) ="<<j<<"\n\n";



j=4294967295;
cout<<"j: (4294967295) = "<<j<<"\n";
j=4294967296;
cout<<"j: (4294967296) = "<<j<<"\n";

j=-1;
cout<<"j: (-1 => 4294967296-1) ="<<j<<"\n";
j=-2;
cout<<"j: (-2 => 4294967296-2) ="<<j<<"\n";
j=-3;
cout<<"j: (-3 => 4294967296-3) ="<<j<<"\n";

j=-32;
cout<<"j: (-32 => 4294967296-32) ="<<j<<"\n";


system("pause");
return 0;
}

کد کاملا گویا است, لازم به ذکر هست که هر دو نوع int 32 بیتی می باشند :


2^32=4294967296

یعنی در نوع بدون علامت یا unsigned از 0 تا 4294967295 , بقیه موارد هم در برنامه واضح است , اگر مشکلی بود هم بگید .

kosar ranjbar
سه شنبه 14 مهر 1388, 21:22 عصر
#include<iostream>
using std::cout;
using std::cin;

#include<windows.h>


int main()
{
int i;
unsigned int j;

i=4294967295;
j=4294967295;
cout<<"i : (4294967295) = "<<i<<"\n\n";
cout<<"j: (4294967295) = "<<j<<"\n\n\n\n";

i=4294967296;
j=4294967296;
cout<<"i : (4294967296) ="<<i<<"\n\n";
cout<<"j: (4294967296) ="<<j<<"\n\n\n\n";

i=4294967297;
j=4294967297;
cout<<"i : (4294967297) ="<<i<<"\n\n";
cout<<"j: (4294967297) ="<<j<<"\n\n";



j=4294967295;
cout<<"j: (4294967295) = "<<j<<"\n";
j=4294967296;
cout<<"j: (4294967296) = "<<j<<"\n";

j=-1;
cout<<"j: (-1 => 4294967296-1) ="<<j<<"\n";
j=-2;
cout<<"j: (-2 => 4294967296-2) ="<<j<<"\n";
j=-3;
cout<<"j: (-3 => 4294967296-3) ="<<j<<"\n";

j=-32;
cout<<"j: (-32 => 4294967296-32) ="<<j<<"\n";


system("pause");
return 0;
}

کد کاملا گویا است, لازم به ذکر هست که هر دو نوع int 32 بیتی می باشند :


2^32=4294967296

یعنی در نوع بدون علامت یا unsigned از 0 تا 4294967295 , بقیه موارد هم در برنامه واضح است , اگر مشکلی بود هم بگید .
من متوجه نشدم آخه بر اساس چه معیاری بدست می آد .
مگر نه اینکه int از 32767 تا -32768 است و unsigned int از 0 تا 65535 است. خوب با چه فرمولی i=j می شود 1 و j=i می شود 4294967264.دنبال اون معیاریم که تبدیل می شن خوب من اعداد مختلف می دم ولی می خوام دلیل جوابهای مختلف رو بدونم .
ممنون می شم جواب بدین

Nima_NF
سه شنبه 14 مهر 1388, 23:43 عصر
سلام در بر نامه زیر i و j جوابش چیست ؟
int i
unsigned int j
j=60000
i=j
cout<<i
i=-32
j=i
cout<<j

در اجرا جواب i=1 و جواب j=4294967264 می باشد چگونه تبدیل شده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
چیزی که شما نوشتید شبهه کد هست، برنامه را به زبان ++C درست و کامل بنویسید تا بتوان نظر داد. (چرا؟ موارد زیر را بخوانید)

1- در شبهه کد فوق، به i مقدار نداده اید و سپس از آن استفاده کرده اید، در حالی که در زبان C++‎‎ این کار خطرناک و اشتباه هست و مقدار متغیر های شما تعریف نشده اند (حال می تواند هر مقدار دلخواهی توسط کامپایلر به آن ها تخصیص داده شده باشد که باز هم اشتباه هست)

2- باید پلتفرم مشخص شود، در کامپایلر های قدیمی مثل TurboC که برای dos بودند، بازه int 16 بیت بود و همان چیزی که گفتید می شود، اما در کامپایلرهای جدید تحت ویندوز و لینوکس و ... 32 بیت هست یعنی 4294967296 .

3- شما یک مقدار در بازه بی علامت (بازه بزرگتر) را به یک بازه کوچکتر با علامت ریخته اید که باز هم خطرناک هست و احتمال دارد که از حافظه متغیر خارج شوید، مگر اینکه خودتان تبدیل ضمنی کنید تا اطلاعات از بازه خارج نشود. پس در این صورت جواب نا مشخص دریافت می کنید و این یک Bug در برنامه خواهد بود.

kosar ranjbar
چهارشنبه 15 مهر 1388, 05:27 صبح
#include <iostream.h>
#include <conio.h>
int main()
{
int i;
unsigned int j;
j=60000;
i=j;
cout<<i;
i=-32;
j=i;
cout<<j;
getch();
return 0;
}



این کل برنامه چرا جواب i=1 و j= 4294967264

zoz_zozm
چهارشنبه 15 مهر 1388, 06:17 صبح
شما يك مقدار علامت دار رو تو يه بدون علامت ريختيد كه اين جواب اشتباهي رو به شما ميده.:لبخند:
اون يكي هم درست جواب ميده

kosar ranjbar
چهارشنبه 15 مهر 1388, 22:31 عصر
طراح کنکور یعنی نمی دونسته اشتباه می باشد

Nima_NF
پنج شنبه 16 مهر 1388, 01:31 صبح
طراح کنکور یعنی نمی دونسته اشتباه می باشد

نگاه کنید از لحاظ syntax نوشتن این کد اشکالی ندارد، چون شما 4 بایت را در 4 بایت ریخته اید، اما از لحاظ نتیجه متفاوت خواهد بود، چرا :

int با علامت بین 2147483647 و 2147483648 هست
و int بدون علامت بین 0 تا 4294967295

عدد 32- دارای محتویات هگز 0xffffffe0 هست، که با توجه به بازه فوق برای علامت دار می شود 31 - 4294967295


دقت کنید که عدد 1- دارای هگز 0xffffffff هست که معادل همان نهایت عدد موجود در int بودن علامت یعنی 4294967295 هست.

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

برای اطلات بیشتر به مراجع خواندن مکمل اعداد منفی و نحوه ذخیره شدن آن ها مراجعه کنید