Отрицательные значения типа signed char в С

Есть такой тип Signed Char. Он имеет диапазон -127...127. Если Char это символ, то как символ может быть отрицательным? И в каком случае принципиально использовать signed а в каком unsigned char?

Вот например есть код функции сравнивающей 2 строки:

int ft_strncmp(const char *s1, const char *s2, size_t n)
{
    size_t  i;

    i = 0;
    if (n == 0)
        return (0);
    while ((i < n) && (s1[i] || s2[i]))
    {
        if (s1[i] != s2[i])
            return (((unsigned char)s1[i] - (unsigned char)s2[i]));
/*Почему здесь используется приведение к типу unsigned char? */
        i++;
    }
    return (0);
}

Ответы (2 шт):

Автор решения: Space Researcher

Char это целочисленный тип данных, с установленным размером в 1 байт(всегда в яп С/С++). В СИ в данном случае этот тип данных может использоваться для хранения кода символа. Данный код определяется таблицей кодировки введите сюда описание изображения

Так вот данный код может быть любым численным значение.
PS char(знаковый) это от -128 до 127
PSS вы можете проверить код символа примерно так:

int main(){
   char a = 'A';
   printf("symbol is %c and code of symb = %d",a,a);
}
→ Ссылка
Автор решения: Harry

Чтобы было понятнее, выполните вот такой простенький код:

for(unsigned int uc = 0;;uc++)
{
    printf("%3i    %c    %3i\n", uc, (char)uc, (signed char)uc);
    if (uc == 0xFF) break;
}

Видите? Это три разных представления одного и того же содержимого байта в памяти. Весь вопрос просто в том, как он трактуется.

→ Ссылка