Por que o caractere 'A' seria comparado com 0x41?

89

Eu estava olhando um código C ++ e encontrei a seguinte construção:

if('A' == 0x41) {
  // ...
} else if('A' == 0xc1) {
  // ...
} else {
  // ...
}

Recebo um aviso do Visual Studio dizendo:

Aviso C4127 expressão condicional é constante.

O Visual Studio está claramente certo - certamente 'A' é definido como 0x41. Por que o autor está escrevendo este código, visto que duas das três ramificações são códigos mortos?

H Bellamy
fonte
30
Eles não são necessariamente um código morto, talvez seja apenas uma maneira idiota de verificar o conjunto de caracteres.
George
60
'A' = C1 em EBCDIC
Harold
14
Eu o colocaria em um cabeçalho de utilitário como #define IS_CHSET_EBCDIC ('A' == 0xc1)etc .; ou, em C ++ moderno, torne-o um constexpr.
Peter - Reintegrar Monica em
8
@ b.buchhold - Não, você pode fazer a compilação cruzada de um PC para o mainframe. Portanto, 'A' deve significar o valor do caractere no conjunto de caracteres de execução.
Bo Persson
2
Parece que isso pode ser feito melhor usando a inclusão condicional do pré-processador (por exemplo, #if 'a' == 41 ... #else ... #endif) para fazer isso ao invés de ramificações dinâmicas para que você não receba avisos como estes . Isso funcionaria?
templatetypedef de

Respostas:

116

0xc1é o EBCDICcódigo do conjunto de caracteres para A. O autor está testando para tal máquina.

http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html

Richard Hodges
fonte
14
"existe uma maneira melhor do que esta para verificar o conjunto de caracteres?" Não existe uma maneira padrão de fazer isso. No C11, há uma maneira de verificar se certas codificações Unicode estão sendo usadas, mas o MSVC nem mesmo oferecerá suporte completo ao C99 (que é anterior ao C11). "Quão comum é esse conjunto de caracteres alternativos!" Além de mainframes IBM? De modo nenhum.
2
Então, para que serve o elsebranch final ? Existe uma codificação de caracteres ainda em uso que não é compatível com ASCII nem com EBCDIC?
dan04 de
8
@ dan04 Nenhum que eu saiba, mas poderia ser realisticamente tão simples quanto um branch de "codificação desconhecida, mensagem de erro de impressão".
8
'A' também é 0xC1 na codificação de caracteres Apple II DOS 3.3, que é ASCII OU com 0x80.
Damian Yerrick
2
@Rhymoid Na verdade, há uma boa chance de que a Microsoft implemente o C11 antes mesmo de oferecer suporte ao C99. Eles foram um dos fornecedores que resistiram aos recursos de difícil implementação do C99, dois dos quais não são mais obrigatórios no C11 en.wikipedia.org/wiki/… .
Steve Cox
11

À primeira vista pode parecer que é um código morto, mas 'A' == 0x41 nem sempre retornará verdadeiro ..

o que o desenvolvedor tentou fazer aqui é preguiçosamente encontrar qual codificação é a máquina que implementa ASCII ou qualquer variante de EBCDIC

como @Richard sugeriu que o Capital a seja mapeado para 0xc1 no Código de Intercâmbio Decimal Codificado em Binário Internacional estendido, veja a tabela abaixo na ramificação 2 do if else ...

insira a descrição da imagem aqui

outro valor diferente pode ser encontrado por ASCII, por exemplo:

insira a descrição da imagem aqui

ele poderia muito bem ter feito:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
fonte
No segundo parágrafo - você quis dizer EBCDIC em vez de EBDIC?
Zze