Ir ao conteúdo

porque existe 1 incompatibilidade entre 1 caracter e a tabela ASCII?


Cambalinho

Posts recomendados

Postado

Porque o 'é' tem valor -23, e não 130

#include <stdio.h>

int main()
{
if ('é' == 130)
printf("São iguais.");
else
printf("São diferentes.");

int i = 'é';
printf("%d", i);


getchar();
return 0;
}

o compilador substitui 'é' pelo numero -23, pois a ISO da linguagem diz que é assim.

Postado
Porque o 'é' tem valor -23, e não 130

#include <stdio.h>

int main()
{
if ('é' == 130)
printf("São iguais.");
else
printf("São diferentes.");

int i = 'é';
printf("%d", i);


getchar();
return 0;
}

o compilador substitui 'é' pelo numero -23, pois a ISO da linguagem diz que é assim.

isso tem haver do char ser -128 a 127, certo?

Postado

Salve Cambalinho,

isso tem haver do char ser -128 a 127, certo?

Bom, tentarei elucidar melhor essa questão, que realmente acho um pouco confusa.

Cambalinho, o char vai ser signed ou unsigned por padrão de acordo com a implementação do seu compilador e da plataforma/sistema (x86 Linux/Win). Como eu sei que você usa o Visual C++, eu não sei onde mudar essa opção. No caso do GCC, basta passar a flag:

-funsigned-char

O segundo ponto central dessa questão: Character Encoding.

O 'é' mencionado faz parte dos caracteres ASCII Estendidos cujo código é 130.

No seu caso, por causa da questão do char sinalizado, o valor exibido acaba sendo -23, porém, o valor desse caractere na verdade é 233. Mas o código refere-se ao caractere codificado em Latin-1 (ISO-8859-1) e não em Extended ASCII. Querendo converter para OEM (CP costuma ser 860, no caso de PT-PT), chame CharToOem(). Segue o exemplo:

#include <stdio.h>
#include <windows.h>

int main()
{
char ch[2];

if ('é' == 130)
printf("Sao iguais.");
else
printf("Sao diferentes.");

unsigned char j = 'é';
printf("\n\ne' - %u\n", j); // deve imprimir 233

ch[0] = 'é';
ch[1] = 0;
CharToOemA(ch, ch);

unsigned char i = ch[0];
printf("\ne' - %u\n", i); // deve imprimir 130

return 0;
}

Pelo menos aqui, o charset de execução do GCC é definido como UTF-8.

[]'s

LNW

Postado
Salve Cambalinho,

Bom, tentarei elucidar melhor essa questão, que realmente acho um pouco confusa.

Cambalinho, o char vai ser signed ou unsigned por padrão de acordo com a implementação do seu compilador e da plataforma/sistema (x86 Linux/Win). Como eu sei que você usa o Visual C++, eu não sei onde mudar essa opção. No caso do GCC, basta passar a flag:

-funsigned-char

O segundo ponto central dessa questão: Character Encoding.

O 'é' mencionado faz parte dos caracteres ASCII Estendidos cujo código é 130.

No seu caso, por causa da questão do char sinalizado, o valor exibido acaba sendo -23, porém, o valor desse caractere na verdade é 233. Mas o código refere-se ao caractere codificado em Latin-1 (ISO-8859-1) e não em Extended ASCII. Querendo converter para OEM (CP costuma ser 860, no caso de PT-PT), chame CharToOem(). Segue o exemplo:

#include <stdio.h>
#include <windows.h>

int main()
{
char ch[2];

if ('é' == 130)
printf("Sao iguais.");
else
printf("Sao diferentes.");

unsigned char j = 'é';
printf("\n\ne' - %u\n", j); // deve imprimir 233

ch[0] = 'é';
ch[1] = 0;
CharToOemA(ch, ch);

unsigned char i = ch[0];
printf("\ne' - %u\n", i); // deve imprimir 130

return 0;
}

Pelo menos aqui, o charset de execução do GCC é definido como UTF-8.

[]'s

LNW

muito obrigado. obrigado a todos

  • 3 semanas depois...
  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...