اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

تفاوت بین unsigned char و char چیه؟

+4 امتیاز
6,064 نمایش

چرا ما هر دوی این‌ها رو داریم؟ کاراکترهای اسکی که ۱۲۸ تا هستن و در هر دو حالت قابل استفاده‌ان. دیگه چرا بین دو حالت 0->256 و -127->128 تفاوت قائل بشیم؟

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده یکشنبه ۴ فروردین ۱۳۹۲ در C++ توسط prodo  

تا الان این مشخص شده که دو نوع داده‌ی کاراکتری داریم. signed و unsigned. نوعی که بدون پیشوند مشخص می‌شه توسط کامپایلر در موردش تصمیم گرفته می‌شه که بدون علامت یا باعلامت باشه.

4 پاسخ

+2 امتیاز

اینجور که من فهمیدم ما سه نوع متفاوت از نوع داده کاراکتر داریم:
char
unsigned char
signed char

حالا مورد استفاده اینا اینجوریه:
در مواقعی که با متنی سر و کار داریم از char استفاده میکنیم چون این نوع داده کاراکترهای واقعی مثل 'a' رو در بر میگیره و همچنین برای داشتن رشته هایی در C هم مورد استفاده ست.

در مواقعی که نوع کاراکتر رو بصورت عدد قراره داشته باشین، دو تا راه دارین:
از signed char استفاده میکنین که حداقل بازه 128- تا 127 رو در اختیار شما میذاره
از unsigned char استفاده میکنین که حداقل بازه 0 تا 256 رو در اختیارتون میذاره.

در ++C زبانی بسیار کوچک‌تر و پاکیزه‌تر در تلاش برای خروج است. (Bjarne Stroustrup)
پاسخ داده شده چهارشنبه ۷ فروردین ۱۳۹۲ توسط برنامه‌نویس  

کاربرد signed char و unsigned char چه تفاوتهایی داره؟

خودمم هنوز کشف نکردم!
خوبه تا اینجا سوال هممون یکی شد حداقل!

دقیقا هدف منم از اینکه الان پرسیدم همین بود که سوال به طور واضح مشخص بشه...!

char == signed char

تصحیح می‌کنم. char همیشه signed char نیست. بستگی به کامپایلر داره که char رو علامت‌دار تفسیر کنه یا بی‌علامت.

+1 امتیاز

بهترین مطلبی که پیدا کردم اینه:
نوع داده char برای استفاده در کاراکترهای اسکی هست و unsigned char برای استفاده در اطلاعات باینری خام.
تمام انواع داده های 8-بیتی 256 مقدار مختلف رو نگه میدارن : از 00 تا FF در مبنای 16 یا 00000000 تا 11111111 در مبنای 2 بصورت باینری.
و تفاوت بین signed و unsigned در اینه که مفسر چطور این بیت‌ها رو تعبیر کنه.
نوع داده unsigned char از بازه 00000000 تا 11111111 به عنوان 0 تا 256 استفاده میکنه و هیچ امکانی برای مقادیر منفی وجود نداره.
خودم که جواب گرفتم. بقیه رو نمیدونم :)

پاسخ داده شده پنجشنبه ۸ فروردین ۱۳۹۲ توسط CPP_Crawler4  

باز هم مشخص نشد. خب کاراکترها که منفی ندارن که بخوایم حتماً از unsigned char استفاده کنیم. از همون char هم می‌شه

فقط 2 تا نکته دیگه میتونم بگم:
1 اینکه معمولا میگن نوع داده‌ی char به مثابه int هست و برعکس. int منفی میفهمه، پس برای تبدیلش به کاراکتر باید یک جوری اون علامت حفظ بشه. (من این کاربردو تو signed میبینم، ولی هنوز نتیجه ی مثبتی تو تستش ندیدم.)
2 اینکه در همین جواب آخری که پیدا کردم طرف (حالا حسابی هم در کار نیست) رسما نوع داده signed char رو با 8 بیت اینطور معرفی کرد که یک بیت مخصوص علامتشه و داده ی خام باینری توسط 7 بیت دیگه ذخیره میشه. بیت اول اگر صفر باشه یعنی عدد مثبت و اگر یک یعنی عدد منفی.
البته بازم این منبع و این شخصی که اینها رو نوشته معتبر نیست، ولی فعلا منطقی ترین جوابه. (به شخصه هنوز موفق به گرفتن خروجی درست از برنامه ای که توش از این داده ها استفاده بشه نشدم.)

+1 امتیاز

من یه چیزی پیدا کردم! توی گرافیک کامپیوتری هر رنگ از ترکیب ۳ رنگ قرمز، سبز و آبی درست می‌شه. این سه مقدار رو در یه سه‌تایی مرتب به صورت (R, G, B) نشون می‌دن. R مقدار رنگ قرمز، G مقدرا رنگ سبز و B مقدار رنگ آبی رو نشون می‌ده. برای این مقادیر یک بایت حافظه در نظر گرفته می‌شه. یعنی مقادیر از ۰ تا ۲۵۵. مثلاً رنگ (255, 0, 0) یعنی قرمز خالص.
برای این مقادیر که یک بایت لازم دارن در بیشتر اوقات از کاراکتر استفاده می‌کنن نه از عدد صحیح به طول ثابت (uint_8). بنابراین ما نیاز به کاراکتر بدون علامت هم داریم. :)
حالا چرا استفاده از کاراکتر علامت‌دار این‌جا بده! چون مثلاً برای سیاه و سفید کردن یه تصویر از رنگ‌هاش میانگین می‌گیرن. مثلاً (255, 0, 0) تبدیل به سیاه و سفید که بشه می‌شه (85, 85, 85) اما اگه بیایم و از کاراکتر علامت‌دار استفاده کنیم رنگ قرمز می‌شه (127, -128, -128) و در صورت میانگین گرفتن می‌شه (-99, -99, -99) یا از نظر رنگی معادل (29, 29, 29)!!! که اشتباهه.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده یکشنبه ۲۵ فروردین ۱۳۹۲ توسط prodo  

اینو منم یه جایی خوندم ولی اصلا نفهمیدم چی به چیه.
الان این عددایی که میگن از کجا میاد؟ چیش کاراکتر ذخیره میشه؟ چجوریه کلا؟

حالا جواب این سوالا که جاش اینجا نیست. ولی به طور کلی این استاندارد RGB هست که می‌شه جستجو کرد همه جا پیدا می‌شه

–1 امتیاز

به نظرم سوالت غلطه!
چون کارکترهای اسکی 256 تا هستن نه 128 تا...
☺ ☻ ♥ ♦ ♣ ♠ • ◘ ○ ◙ ♂ ♀ ♪ ♫ ☼ ► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼
کد اسکی این کارکترها از راست به چپ از 1 شروع میشه تا 31...
کد اسکیه 32 فضای خالیه ( یا همون space)
بعد از 33 تا 64 ایناست:
!"#$%&'()*+,-./0123456789:;<=>?@
از 64 تا 90 حروف بزرگ انگلیسی،
از 91 تا 96 ایناست:
[]^_`
از 97 تا 122 حروف کوچک انگلیسی،
از 123 تا 254 ایناست:
{|}~⌂€é℆çêëèïّْô¤ـûùءآأؤ£إئابةتثجحخدذرزسشص«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄
...
(من تا 220 رو نوشتم)
و 255 هم باز فضای خالیه
واسه نوشتن این کارکترها میتونی alt رو نگه داری و کد اسکی-ای که میخوای رو با NumberPad تایپ کنی، بعد که alt رو ول کنی اون کارکتر نوشته میشه...
اینم بگم که برای بعضی از کد اسکی ها چیزی نمایش داده نمیشه، اصطلاحا به اونها command گفته میشه که توضیح اونها تو این پست لازم نیست.
نوع char فقط حروف و اعداد و علامت های معمولی(که رو کیبورد هستن)
نوع unsigned char تمام اوناییه که بالا گفتم که شامل char هم میشه...
امیدوارم منظورت از این سوال همین باشه که جواب دادم;

Don't Expect Anyone Except Yourself,...
پاسخ داده شده سه شنبه ۶ فروردین ۱۳۹۲ توسط Arash  
بازدید شده پنجشنبه ۲۹ فروردین ۱۳۹۲ توسط admin
ASCII includes definitions for 128 characters: 33 are non-printing control characters that affect how text and space are processed and 95 printable characters, including the space

اما جدا از این قضیه سوال من اینه که چرا برای نوع داده‌ی کاراکتر می‌شه هم بدون علامت و هم باعلامت در نظر گرفت. عجیبه به نظرم

-۱ واسه اشتباه در تعریف اسکی. لطفاً ویرایش کنین

کدوم قسمتش اشتباست؟

از نظر تعریف رسمی اسکی ۱۲۸ کاراکتر داره.