Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
AzaZell

Caractere hexadecimal

Recommended Posts

<font color='#000000'>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?</font>

Compartilhar este post


Link para o post
Compartilhar em outros sites

<font color='#000000'>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:</font>

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • <font color='#000000'>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...</font>

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    <font color='#000080'>

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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • <font color='#000000'>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====</font>

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • <font color='#000000'>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</font>

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×