View Full Version : کد فوق العاده عجیب 2
sa1378
دوشنبه 13 مرداد 1393, 18:07 عصر
سلام
با یه قسمت دیگه از کد عجیب در خدمتتون هستیم
این کد چرا خروجیش اینجوریه؟
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v;
for(int i=0 ; i*i<=16 ; i++)
v.push_back(i*i);
for(int j=0 ; j<v.size() ; j+=2)
v.pop_back();
cout<< ( (v.back()) - (v.size()) ) <<endl;
cout<< ( (v.size()) - (v.back()) ) <<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
خروجی:
1
4294967295
rahnema1
سه شنبه 14 مرداد 1393, 11:20 صبح
اینجا مقدار size برابر با 3 و نوع آن unsigned int هست و مقدار back برابر با 4 و نوع آن int هست
در یک عبارت که عملوندهای یک عملگر هر دو عدد صحیح باشند و سایز هر دو یکی باشه ( یعنی هم int و هم unsigned int هر دو یک اندازه هستند)، نوع اون که علامت دار هست باید به بی علامت تبدیل بشه یعنی ابتدا نوع back به unsigned int تبدیل می شه
حالا که نوع هر دو عملوند یکی شد ، نتیجه عبارت هم از نوع unsigned int خواهد بود
فقط یک نکته در مورد unsigned این هست که مقدار unsigned هیچ گاه دچار سرریز نمیشه چون هر عددی که در محدوده Unsigned جا نشه معادلش میشه باقیمانده تقسیم اون عدد تقسیم بر ( یک + بیشترین عددی که میتونه توی unsigned جابشه)
مثلا در سیستم 32 بیتی unsigned int میتونه از صفر تا دو به توان 32 منهای یک مقدار بگیره مثلا معادل 1- میشه
یعنی حاصل عبارت به صورت چرخشی عمل می کنه هر جا نشد میره بیشترین عدد را در نظر می گیره و از اون کم می کنه
0 ... 2^32-1
0 ... 4294967296-1
0 ... 4294967295
(-1) mod ((2^32)) =
-1 mod 4294967296 = 4294967295
sa1378
سه شنبه 14 مرداد 1393, 14:45 عصر
ممنون
ولی چجوری از Unsigned به int تبدیلش کنم؟
rahnema1
سه شنبه 14 مرداد 1393, 15:58 عصر
ممنون
ولی چجوری از Unsigned به int تبدیلش کنم؟
میشه بگید دقیقا چیکار می خواهید بکنید؟
sa1378
سه شنبه 14 مرداد 1393, 18:39 عصر
هیچی
من معمولا توی برنامه هام کاری نمیکنم
فقط آزمایشی برای تمرین مینویسم
میخوام وقتی مینویسم:
cout<< ( (v.size()) - (v.back()) ) <<endl;
-1 رو چاپ کنه
rahnema1
سه شنبه 14 مرداد 1393, 19:22 عصر
اگه در جواب قبلی دقت کنید جواب این سوال هم داده شده
گفتم که حاصل عبارت از نوع unsigned int هست
بنابراین شما باید یه کاری بکنید که حاصل عبارت int بشه
که با cast کردن می شه انجام داد
cout<< ( int(v.size()) - (v.back()) ) <<endl;
cout<< ( (int)(v.size()) - (v.back()) ) <<endl;
cout<< int( (v.size()) - (v.back()) ) <<endl;
cout<< (int)( (v.size()) - (v.back()) ) <<endl;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.