View Full Version : اطلاعاتی در باره ی نوع int8__ در vC++
someday
دوشنبه 25 اسفند 1393, 22:17 عصر
سلام
مایکروسافت در مورد int8__ میگه که این نوع داده 1 بایته و برابر با همون char هست حالا سوال اینه که
با توجه به لینک زیر
https://msdn.microsoft.com/en-us/library/aa273695%28v=vs.60%29.aspx
پس این یعنی اینکه من میتونم با این نوع داده از کاربر کاراکتر بگیرم؟
و اینکه چرا من کنسول vC++ یه رشته ی طولانی از این نوع متغییری که تعریف کرده بودم میگرفتم و چاپ میکردم سریز نمیکرد یعنی برخلاف حرفش خیلی بیشتر از 1 بایت میگرفت
rahnema1
دوشنبه 25 اسفند 1393, 22:44 عصر
سلام، رشته عبارت است از آرایه ای از کاراکترها و هر کاراکتر هم 1 بایته نه کل رشته .
someday
سه شنبه 26 اسفند 1393, 01:41 صبح
دوست عزیز سوال من رو متوجه نشدید
من عرض کردم این نوع داده یک بایت میگیره، پس چرا تو عمل رشته هم بهش میدی تو خودش میگیره؟
عدد هم همین طور
بعنوان مثال این باید از -127 تا 127 اوکی کنه در حالی که شما اینو بدی 11111111111111111111111111111111111111111
قبول میکنه و چاپ میکنه
چرا؟
اصلا اینجووری بگیم
__int8 a;
cin>>a;
cout<<a;
خب حالا انتظار ما اینه یه کاراکتر بگیره یا حد بازه ی عددی که گفتم رو بگیره
ولی شما به این برنامه aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aa رو بدید همینو چاپ میکنه
rahnema1
سه شنبه 26 اسفند 1393, 05:48 صبح
من نتونستم این رفتاری که شما می گویید بازتولید کنم
این را امتحان کنید:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
__int8 a;
stringstream strm ("aaaaaa");
strm >> a;
cout << a << endl;
}
someday
پنج شنبه 06 فروردین 1394, 03:26 صبح
ممنون دوست گرامی
مشکل اینجا بود که vs اجازه ی سریز نمیده و خودش هر چند تا کاراکتر ورودی باشه همون رو چاپ میکنه
و برنامه باید به صورت مستقل اجرا بشه تا نتیجه درست بده
نکته ی دیگه اینکه بازه این نوع –128 to 127 می باشد اما وقتی عدد 22 رو مثلا بهش میدیم به عنوان یک کاراکتر میبینه و فقط رقم اول رو چاپ میکنه
حالا با ااین اوصاف اون بازه پس برا چیه؟
rahnema1
پنج شنبه 06 فروردین 1394, 08:45 صبح
همون طور که در MSDN (https://msdn.microsoft.com/en-us/library/29dh1w7z.aspx) هم گفته شده int8__ همون char هست
وقتی که یک char را به << بدهیم در واقع عدد توی اون ذخیره نمیشه بلکه حرف ذخیره میشه یا به عبارت دیگه در کامپیوترهایی که داریم کد اسکی در ذخیره میشه
این را امتحان کنید مثلا اینجا معادل اسکی حرف '2' یعنی 50 در a ذخیره می شه
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
__int8 a;
stringstream strm ("22");
strm >> a;
cout << (int)a << endl;
}
someday
پنج شنبه 06 فروردین 1394, 14:33 عصر
بله من هم حرف شما رو قبول دارم اما میخوام بدونم منظور MSDN از مقدار بین بازه –128 to 127 چیه؟
rahnema1
پنج شنبه 06 فروردین 1394, 17:11 عصر
بله من هم حرف شما رو قبول دارم اما میخوام بدونم منظور MSDN از مقدار بین بازه –128 to 127 چیه؟
به خاطر اینه که توی اون جایی که شما مطالعه کردید، اومده char را به عنوان یک نوع صحیح علامتدار در نظر گرفته که می تونه اعداد بین 128- تا 127 را بگیره و حروف هم معادل هست با کد اسکی 0 تا 127
توی همین سایت یا جاهای دیگه در خصوص نوع char و حروف اسکی به طور مفصل توضیح داده شده
someday
یک شنبه 09 فروردین 1394, 00:07 صبح
ممنون با این توضیحات ما انتظار داریم خروجی سه حالت زیر متفاوت باشه با توجه به بازه ی اونها
cout<<(char)200<<endl<<(signed char)200<<endl<<(unsigned char)200<<endl;
اما خروجی یکی هست
در کل من میخوام بدونم در خروجی چه تفاوتی دارن؟ دنبال یه کدی هستم که تفاوتشون رو بهم نشون بده
rahnema1
یک شنبه 09 فروردین 1394, 08:59 صبح
این چه طوره؟
cout<<(int)(char)200<<endl<<(int)(signed char)200<<endl<<(int)(unsigned char)200<<endl;
someday
یک شنبه 09 فروردین 1394, 15:27 عصر
اینجا خروجی تغییر میکنه ولی ما قرار بود با داده ی char سروو کله بزنیم نه int اگه تغییرش قراره فقط تو عدد لمس بشه خب میریم سراغ انواع int چرا الکی درگیر char بشیم
یعنی واقعا الان بین دوستان کسی تا حالا رو این موضوع ریز نشده؟
خرجی مختلف از حالت های مختلف char میخوام
rahnema1
یک شنبه 09 فروردین 1394, 16:30 عصر
ببینید دقیقا سوال شما معلوم نیست اینکه می خواهید بدونید cout اینها را چه جوری نمایش میده؟ جواب اینه که cout هر سه تا را در ابتدا تبدیل به char می کنه بعد نمایش میده
someday
دوشنبه 10 فروردین 1394, 21:08 عصر
نه دوست عزیز
ببینید حرف من اینه که وقتی داده ای از نوع int تعریف میشه من عدد 3000000000 رو نمیتونم نمایش بدم چون بازه ی این عدد کمتر هست اما وقتی unsigned int رو تعریف می کنم میتونم این عدد رو در اون جای بدم
حالا میایم سراغ دنیای کاراکتر ها
میخوام ببینم من چکاری با char نمیتونم بکنم که با unsigned char میتونم انجامش بدم؟؟؟؟
مثالی که شما زدید اومدید تبدیل به int کردید
اما حرف من اینه که اینجا حرف از کاراکتر هاست نه int
حرف من اینه که char که اومد دیگه کافی بود حالا این وسط unsigned char اضافس ( در واقع نیست اما مسئله رو اینجوری تعریف میکنیم تا به جواب برسیم)
حالا میخوام بهم ثابت بشه که نه ، دردنیای کاراکترها یه جاهایی لازمه unsigned char استفاده کنیم
rahnema1
دوشنبه 10 فروردین 1394, 21:44 عصر
ببینید char یک نوع عددی هست و مثلا 'a' هم معادل یک عدد هست ( مثلا کد اسکی حرف a که برابر است با 97 )
شما به معنای تحت اللفظی char توجه نکنید که به معنای کاراکتر هست شما اون را به عنوان یک نوع عددی صحیح ببینید
وقتی می گیم یه نوع عدد صحیح بدون علامت هست فرقی نمی کنه char باشه یا int باشه همون قواعدی که روی int اجرا میشه روی char هم برقراره
فرض کنیم یک بایت برابر 8 بیت باشه و unsigned char میتونه مقادیر 0 تا 255 را بگیره
در این مثال:
(unsigned char)200
200 از نوع int هست که ما تبدیل به unsigned char می کنیم چون unsigned char تا 255 می تونه بگیره مشکلی وجود نداره و تبدیل انجام میشه و 200 در عدد ذخیره میشه
اما در مورد (signed char)200
به علت اینکه signed char میتونه حداکثر تا 127 بگیره بنابراین در استاندارد ++c گفته شده نتیجه این عمل بسته به پیاده سازی داره ممکنه نتیجه برابر 127 بشه یا نه ممکنه باقیمانده تقسیم 200 بر 255 را نتیجه بده یا ..
char هم باز بسته به پیاده سازی یا میتونه unsigned char باشه یا signed char باشه
بنابراین شما char را به عنوان یک int ببینید اما دامنه اعدادش کوچکتر از int باشه
someday
دوشنبه 10 فروردین 1394, 22:32 عصر
اما در مورد (signed char)200
به علت اینکه signed char میتونه حداکثر تا 127 بگیره بنابراین در استاندارد ++c گفته شده نتیجه این عمل بسته به پیاده سازی داره ممکنه نتیجه برابر 127 بشه یا نه ممکنه باقیمانده تقسیم 200 بر 255 را نتیجه بده یا ..
بنابراین شما char را به عنوان یک int ببینید اما دامنه اعدادش کوچکتر از int باشه
دقیقا مسئله همینه که signed char هم همون خروجی رو میده برای 200 که unsigned میده
و اینکه ما در c++ نوع داده ای با نام char داریم رو هم قبول داریم و در واقع همون int هست
اما با این تفاسیر پس باید بگیم رسما الکیه
درسته؟
خب وقتی این دو نوع با هم فرقی ندارن پس یکی هستن دیگه
اگه عدد بود خب میگفتیم دامنه ی عددش مشخصه و یه محدودیتی داره
اما وقتی میرسیم سر کاراکتر من انتظار دادم نتونم با نوع داده ی signed کاراکتری که کد اسکیش بالاتر از 127 هست رو چاپ کنم اما با unsigned بتونم
در حالی که اینجور نیست
اگه اینطور بود من قانع میشدم که بله unsigned رو برای تعریف کاراکترهایی که کد اسکیشون بیشتر از 127 هست بکار میبریم
ولی مسئله اینه که اینم در عمل وجود نداره
پس چه خیری داره؟
rahnema1
سه شنبه 11 فروردین 1394, 01:04 صبح
مشکلی جود نداره از این جهت که بشه این سه نوع را به یک شکل در آورد یا یکی را به شکل دیگری نمایش داد
مثلا اینجا 200 معادلش میشه 56- حالا چه ما 200 بدیم چه 56- در هر صورت خود cout تشخیص میده و یک کاراکتر واحد را برای ما نشون میده
signed char a = -56;
unsigned char b = 200;
unsigned char c = *((unsigned char *)&a);
signed char d = *((signed char *)&b);
cout<< (int)a <<endl<< (int)b <<endl<< (int)c <<endl<< (int)d <<endl;
someday
شنبه 15 فروردین 1394, 20:10 عصر
ممنون
اما یا من نمیتونم مسئله رو برسونم یا شما ذهنتون رو قسمت دیگه اس
ببینید من نمیدونم شما چرا اسرار دارید که اینا رو به int تبدیل کنید
اینکه در واقع اینا int هستن بله درست
اما حالا که برچسب کاراکتر بهشون زدیم پس بیخیال دنیای عدد
اقا اصلا مسئله رو عوض میکنم
یه مسابقه راه انداختیم:
سوال مسابقه اینه که هرکی تونست با یک قطه کد ساده نشون بده که با استفاده از سه جز زیر که هر سه هم باید در کد باشن تفاوت دو نوع داده ی signed , unsigned char رو نشون بده
1- کاراکترها (هر نوع کاراکتری)
2- cout
3- signed,unsigned char
rahnema1
شنبه 15 فروردین 1394, 20:31 عصر
آخه شما یه سوال می پرسید می روید سه چهار روز دیگه بر می گردید. لطفا دقیقا سوال خودتون را بگید. سه تا سوال را با هم نپرسید هر جا ابهام داشتید بپرسید تا پله پله بریم جلو
someday
یک شنبه 16 فروردین 1394, 23:48 عصر
یعنی شما بعد این همه توضیح متوجه سوال من نشدید هنوز؟
اقا بدون اینکه یه کلمه از int بیارید
و با کمک چاپ کاراکتر ها تفاوت بین unsigned , signed رو در char نشون بدید
همین
من با چند شکل مختلف سوالم رو از اول این تاپیک مطرح کردم
rahnema1
یک شنبه 16 فروردین 1394, 23:58 عصر
چاپ کاراکتر ها هیچ فرقی با همدیگه نمی کنه چون cout همه را به یک چشم نگاه می کنه
someday
دوشنبه 17 فروردین 1394, 03:26 صبح
اهان پس رسما باید بگیم که این دو نوع با هم فرقی ندارن
درسته؟
البته از نظر مقداردهی یک کارکتر
rahnema1
دوشنبه 17 فروردین 1394, 16:38 عصر
اهان پس رسما باید بگیم که این دو نوع با هم فرقی ندارن
درسته؟
البته از نظر مقداردهی یک کارکتر
ببینید من دو تا جوجه دارم. یکی از اونها جوجه اردکه و اون یکی جوجه مرغ
هر دوتا را به یک اندازه دوست دارم و برای هر دو به یک اندازه خوراک جوجه میذارم حالا چون من بین اون دو تبعیض قائل نمی شم اون دو تا یکسان هستند؟
دو تا جوجه به نام signed char و unsigned char را به cout معرفی می کنیم اما cout هر دو تا شون را به یک چشم نگاه می کنه آیا ماهیت این دو یکسان می شه؟
ماهیتا با هم فرق دارن اما cout با اونها رفتاری یکسان داره
someday
دوشنبه 17 فروردین 1394, 17:28 عصر
ممنون خب cout رو اگه مثال میزنیم بخاطر ماهیت کاربردش هست و باعث میشه کاربر خروجی رو با چشم ببینه
حالا cout اونها رو با یه چشم نگاه میکنه خیلی مهمه چون cout حق نداره در داده ی من دخل و تصرف داشته باشه و باید سعی کنه با حفظ ماهیت داده ی من رو چاپ کنه پس وقتی cout داره اینجوری برخوردد میکنه میشه گفت مهم نیست و تقریبا یکی هستن
وقتی cout با یه چشم نگاه میکنه چه تفاوتی داره توابع دیگه جور دیگه نگاه کنن
rahnema1
دوشنبه 17 فروردین 1394, 23:34 عصر
ممنون خب cout رو اگه مثال میزنیم بخاطر ماهیت کاربردش هست و باعث میشه کاربر خروجی رو با چشم ببینه
حالا cout اونها رو با یه چشم نگاه میکنه خیلی مهمه چون cout حق نداره در داده ی من دخل و تصرف داشته باشه و باید سعی کنه با حفظ ماهیت داده ی من رو چاپ کنه پس وقتی cout داره اینجوری برخوردد میکنه میشه گفت مهم نیست و تقریبا یکی هستن
وقتی cout با یه چشم نگاه میکنه چه تفاوتی داره توابع دیگه جور دیگه نگاه کنن
ببینید ما با زبان c هم که کار می کنیم تابع putc وجود داره. هر عددی به این تابع بدیم ابتدا اون را به unsigned char تبدیل می کنه سپس اون را چاپ می کنه یعنی منظورم این رفتار cout خیلی عجیب و غریب نیست
یک نکته دیگه در داخل cout یک کاری که انجام میشه همچین تابعی صدا زده میشه:
str.rdbuf()->sputc(c);
که یه جا در استاندارد ذکر شده در صورت همزمان بودن استریم ++c با استریمc در نتیجه اون تابع رفتارش با putc یکسان خواهد شد
someday
سه شنبه 18 فروردین 1394, 01:05 صبح
خب حرف شما صحیح من نمیگم اشتباه میگید
میخوام بگم در نتیجه اینکه unsigned , signed فرقی ندارن و یکی هست ( در دنیای کاراکترها)
rahnema1
چهارشنبه 19 فروردین 1394, 08:06 صبح
میخوام بگم در نتیجه اینکه unsigned , signed فرقی ندارن و یکی هست ( در دنیای کاراکترها)
این جمله فکر کنم یه کم مبهمه. میتونه برداشتهای مختلفی ازش بشه شاید مثلا اگه فقط همین جمله را تنها یه جا بگید لازم باشه چندین خط هم در مورد این جمله توضیح و تفسیر ارائه کنید حالا اگه می پسندید این جور بگید خب من مانع نمیشم :)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.