Algumas correções a alguns comentários feitos acima:
Se você armazenar 65 em uma variável char e pedir para imprimir com printf("%c\n", variavel), seu resultado será a letra "A", que é representada pelo número 65. Isso porque o C trabalha com ASCII, o American Standard Code for Information Interchange (Código Padrão Norte-americado para Intercâmbio de Informações).
Não necessariamente. O C não prescreve nenhum conjunto de caracteres. É possível ter C em máquinas que usem EBCDIC (como
mainframes da IBM, que até hoje usam esse conjunto de caracteres; nessa máquina, o caráter impresso como resultado do trecho de código acima seria um caráter inválido).
A única relação do C com ASCII é que o padrão evita usar na na definição da linguagem símbolos que não tenham representação no ASCII (como setinhas, usadas em PL/I, ou “¬”, usado em outras e na própria notação de Lógica Matemática). O padrão do C reconhece ainda que nem todos os caracteres do ASCII usados por um programa em C estão presentes em todos os conjuntos de caracteres (por exemplo: “#”, “<”, “>”, “^” ou “~”, entre outros), e oferece meios alternativos, como dígrafos e trígrafos, como substitutos quando se usam tais conjuntos.
Char e unsigned char trabalham praticamente da mesma maneira que int e unsigned int.
De novo, não necessariamente.
char pode representar o mesmo conjunto de valores de
signed char ou o mesmo conjunto de valores de
unsigned char, dependendo do sistema e de como o compilador tenha sido configurado para funcionar. Ainda que o
default dos PCs com x86 ou amd64 seja ter caracteres que vão de -128 a 127, isso geralmente pode ser mudado manualmente no momento da compilação por meio de opções do compilador.
printf("%d\n", sizeof(char)); Quando o argumento passado para
printf (ou recebido através de
scanf) é do tipo
size_t (que é o caso do valor devolvido pelo operador
sizeof), o certo seria dizer o seguinte.
printf("%zu\n", sizeof(char)); Um dado do tipo char conseguiria armazenar números inteiros de -127 a +127.
A não ser que a configuração
default do compilador (ou aquela solicitada explicitamente por quem vai compilar o programa) faça com que a compilação considere
char não-qualificado como sem sinal. Se nos nossos PCs o mais comum é usar com sinal, nos nossos dispositivos Android baseados em ARM é mais comum que seja sem sinal.
E o menor negativo nos nossos PCs com Intel é -128.
Já a tabela ASCII extendida vai até 255
Qual é “a” tabela ASCII estendida (formas verbais com s)? Existem vários conjuntos de caracteres, com diferentes tamanhos, que deliberadamente escolheram colocar nas primeiras 128 posições os mesmos símbolos que o ASCII e na mesma ordem, podendo, por isso, até ser entendidos como extensões (formas nominais com x) do ASCII. Mas nenhum desses conjuntos pode ser considerado,
de iure, “a” extensão do padrão — talvez o que mais se aproxime, contendo apenas oito bits, sejam os conjuntos definidos pela ISO-8859; mas, como ficam claro, nem mesmo essa norma define apenas um conjunto, mas vários.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)