ما توی کد سطح پایین (اسمبلی ) چیزی به اسم char ,int ,double و... نداریم متغیر ها به این شکل تعریف میشن byte word dword,... و بصورت یک بلاک حافظه هستن که چند تا بیت داره !
توی زبان سطح بالایی مثل C برای مفهومی تر شدن ! به هر کدوم از اینا یک اسم دادن مثلا byte چون بیشتر برای ذخیره کاراکتر استفاده میشه اسمش رو گذاشتن char که معادل 8 بیت حافظست... کامپایلر c هم اینارو برای اجرا تبدیل به همون کد اسمبلی معادل می کنه .
جروف خودشون کد اسکی دارن که مثلا برای a تا z فکر کنم از 65 شروع میشه تا 92 وقتی هم که یک حرف رو ذخیره می کنین در اصل همون کاراکتر اسکی که یک عدد هست ذخیره میشه (منظورم اینه که کاراکتر خودش یکجور عدد حساب میشه )
char رو به عنوان یک بلاک 8 بیتی حافظه در نظر بگیر که یکی از کاربرداش ذخیره کاراکتر هست .
میتونی داخل unsigned char اعداد بین 0-255 رو هم ذخیره کنی . یا اگر signed باشه میشه اعداد منفی رو هم ذخیره کرد مثلا -10 خب طبیعتا وقتی که اعداد داخل بازه 0-255 هستن بهتره داخل char ذخیره بشن بدلیل مصرف حافظه کمتر (char یک بایت مصرف می کنه ولی int چهار بایت ! )
یکی از جاهای دیگه ای که استفاده میشه مثلا opencv هستش که داخل این کتابخونه تصاویر خاکستری (gray scale ) داخل یک وکتور از uchar یا همون unsigned char ذخیره میشن(چون هر پیکسل عکس معولا از 0-256 تا رنگ می تونه داشته باشه و مقدار منفی نداره )