Ir ao conteúdo
  • Cadastre-se

Caractere hexadecimal


AzaZell

Posts recomendados

Estava testando uns códigos em C++ e me deparei com o seguinte erro, nesse comando...

std::cout<<"A m\x082dia \x82: ";

Ou seja estou querendo exibir a palavra "média" com acento em modo win32 console application... mas dá esse erro ao compilar

error C2022: '2093' : too big for character

provavelmente deve ser por causa do \x82 que significa o caractere "é" em hexadecimal...  uma solução seria fazer a palavra média totalmente em hexadecimal... mas minha dúvida é porque está dando esse erro... não é possível que o compilador não está conseguindo tratar o \x82 de modo correto... Alguém tem alguma explicação?

Link para o comentário
Compartilhar em outros sites

1 - tente separar os dois és:

std::cout<<"A m\x082";

std::cout<< "dia \x82: ";

e veja em qual linha dá pau.

A propósito: verifique se essa é a maneira correta de "escapar" e escrever dando o código ASCII (ou Unicode)

Outra coisa, 082 diferente de 82=>  082 é octal...   :-baaa

ou faça da maneira mais "difícil":

cout<< " A média é:"  :crazy:

Link para o comentário
Compartilhar em outros sites

acontece que na maneira mais "difícil"... o caractere não é exibido corretamente em alguns sistemas operacionais... semelhante aos comando em HTML exemplo: "& g t" é melhor do que escrever ao correspondente do teclado, para deixar mais portável...

só algumas observações.... meio inútel, mas vou comentar:

1) 082 não é octal... octal seria o82, e não zero...

2) zeros a esquerda não influem no resultado.... 1 é a mesma coisa que 0000000001 ex: int a=000000001;

3) esse zero eu coloquei, saiu sem querer...

4) voltando a minha pergunta e dúvida(do tópico inicial) é como o compilador trata os caracteres hexadecimais... ou seja pelo que estava vendo... o você++6.0 não suporta mais que 5 dígitos seguidos de \x, ou não sei se é a programação que está errada ou eles nem se preocuparam com isso em mesclar hexadecimal com caracteres normais...

5) não entendi essa frase: "A propósito: verifique se essa é a maneira correta de "escapar" e escrever dando o código ASCII (ou Unicode)"... aqui eu vou responder o que eu tentei entender da sua frase... sim o \x82 equilave ao caractere "é"...

6) ...e também não nem me preocupo com esse tipo de erro, já que foi somente uma dúvida insignificante que me surgiu ao compilar um programa... e queria ver se alguém já tivesse essa dúvida...

7) 1 - tente separar os dois és:

std::cout<<"A m\x082";

std::cout<< "dia \x82: ";

isso somente é uma das gambiarras possíveis... assim como já tinha comentado em escrever tudo em hexadecimal... mas valeu pelo comentário...

Link para o comentário
Compartilhar em outros sites

Postado Originalmente por AzaZell@06 Julho 2003,15:08

acontece que na maneira mais "difícil"... o caractere não é exibido corretamente em alguns sistemas operacionais... semelhante aos comando em HTML exemplo: "& g t" é melhor do que escrever ao correspondente do teclado, para deixar mais portável...

Não vejo como isso vai deixar mais portável. Isso não é semelhante ao HTML; em HTML a seqüência serve para ser traduzida adequadamente pelo cliente, para mostrar o caracter correto; as seqüências de escape \<dígitos octais> e \x<dígitos hexadecimais> servem primariamente para se colocar caracteres "não-digitarveis"., mas tem o mesmo efeito que se você tivesse digitado tal e qual diretamente (se isso não causasse problemas na compilação). A seqüência \x41 vai imprimir o caracter de código 65 ("A" na grande maioria dos casos), e \x82 vai imprimir o caracter 130 (que equivale ao "é" se o sistema estiver com codepage ISO 8859-1; senão pode ser um caracter qualquer).

Postado Originalmente por AzaZell+06 Julho 2003,15:08-->
1) 082 não é octal... octal seria o82, e não zero...

Dentro da string, existem duas seqüências de escape que aceitam números:

\<octal digits> character value in octal
\x<hex digits>  character value in hexadecimal

Tratando-se de uma constante númerica, 82 é decimal, 0x82 é hexa e 082 é octal.

AzaZell@06 Julho 2003,15:08

2) zeros a esquerda não influem no resultado.... 1 é a mesma coisa que 0000000001 ex: int a=000000001;

Teste o código:

#include <iostream>

using namespace std;

int main()
{
       int     a = 021,
               b = 21;

       if (a==
               cout << "DKO deu mancada:";
       else
               cout << "AraZell deu mancada:";

       cout << " a=" << a << ", b=" << b << endl;

       return 0;
}

Postado Originalmente por AzaZell@06 Julho 2003,15:08

4) voltando a minha pergunta e dúvida(do tópico inicial) é como o compilador trata os caracteres hexadecimais... ou seja pelo que estava vendo... o você++6.0 não suporta mais que 5 dígitos seguidos de \x, ou não sei se é a programação que está errada ou eles nem se preocuparam com isso em mesclar hexadecimal com caracteres normais...

Para representar um único caracter de 8 bits você não vai precisar mais que dois dígitos hexadecimais.

Mas realmente não percebi o porquê do erro indicado pelo compilador. Um mero "cout << "a\x82iou";" deveria funcionar....

Link para o comentário
Compartilhar em outros sites

realmente viajei... hehehe que mancada!!

viajei tanto que nem existe "\o" esqueci de testar antes de postar...

valeu pelas explicações aí... e já deixei de lado esse erro de compilação... na verdade nem tentei ver a fundo o que era... mas se eu tiver tempo eu dou uma procurada e dou um post aqui...

====Begin of Edit====

Apesar do DKO estar certo dos inúmeros erros que cometi, não resisti a brincadeira... hehehe


#include <iostream>

using namespace std;

int main()
{
      int     a = 021,
              b = 21;

      if (a==
              cout << "DKO deu mancada:";
      else
              cout << "AraZell deu mancada:";

      cout << " a=" << a << ", b=" << b << endl;

      cout << "1x0 pra DKO\n" << endl;

      a = 0x000000000000000000000000021,
      b = 0x21;

      if (a==
              cout << "DKO deu mancada:";
      else
              cout << "AraZell deu mancada:";

      cout << " a=" << a << ", b=" << b << endl;

      cout << "1x1 Empatado\n" << endl;

      if ( 0001 == 1 )
              cout << "Aqui tamb\x82m ignorou os zeros \x85 esquerda!" << endl;

      cout << "1x2 pra AzaZell de virada... hauhauahuahau!!!\n"<<endl;
         

      return 0;
}

====End of Edit====

Link para o comentário
Compartilhar em outros sites

Bom, já descobri o erro que cometi... e vou postar aqui... dei uma editada porque o anterior tinha ficado meio estranho...

O que acontece, é que o formato hexadecimal é o seguinte: "\xH" onde 'H' equivale a UMA ou MAIS sequências de caracteres do formato hexadecimal, não havendo LIMITE... diferentemente do formato octal que é o seguinte: "\0O" onde 'O' equivale a SOMENTE 1,2 ou 3 caracteres do formato octal.  

ou seja eu estava tentando imprimir: "m\x82dia" o que, de acordo com a especificação... quer dizer, "imprimir o caractere hexadecimal 82d", mas não existe caractere '82d' no ASCII então dá o erro de compilação, falando que é muito grande! no qual, esse erro acusado pelo compilador, é bem óbvio... não existe o caractere hexadecimal '82d' na representação ASCII, o máximo que vai é até 'ea'.

Mas porque "m\x82pdia" imprime corretamente¿? Simplesmente porque o caractere 'p' não é hexadecimal (resumindo, o compilador sabe que 'p' não é hexadecimal e então, a impressão ocorre normalmente)... diferentemente do formato octal, que de acordo com a especificação, para "imprimir" o formato do Som do alto falante, pode ser tanto \7, \07, \007, \007X onde X pode ser qualquer caractere já que a especificação impõe a regra: somente 1, 2 ou 3 caracteres do formato octal... mas obviamente se imprimir \400 vai dar pau na compilação pois não existe o caractere no formato ASCII para o octal '400'.

Bom, tópico encerrado...

Obs: Ah, aqui vai mais um exemplo de como resolver o problema (dentre dezenas de outras maneiras)... mas esse, se estudar a fundo, vocês irão adquirir um conhecimento melhor, do problema que é citado no tópico...

std::cout<<"m\x82" "dia"<<std::endl;

Obs: esse tópico é bom pra pegar aquele seu professor chato de C++.... hehehe

Link para o comentário
Compartilhar em outros sites

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...