¿Por qué se compararía el carácter 'A' con 0x41?

89

Estaba mirando algo de código C ++ y encontré la siguiente construcción:

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

Recibo una advertencia de Visual Studio que dice:

Advertencia La expresión condicional C4127 es constante.

Visual Studio está claramente en lo cierto, seguramente 'A' se define como 0x41. ¿Por qué el autor escribe este código, dado que dos de las tres ramas son códigos muertos?

H Bellamy
fuente
30
No son necesariamente un código muerto, tal vez sea solo una forma tonta de verificar el conjunto de caracteres.
George
60
'A' = C1 en EBCDIC
harold
14
Lo pondría en un encabezado de utilidad como #define IS_CHSET_EBCDIC ('A' == 0xc1)etc .; o, en C ++ moderno, conviértalo en un constexpr.
Peter - Reincorpora a Monica
8
@ b.buchhold: no, puede compilar de forma cruzada desde una PC al mainframe. Entonces, 'A' debe significar el valor del carácter en el juego de caracteres de ejecución.
Bo Persson
2
Parece que esto podría hacerse mejor usando la inclusión condicional del preprocesador (por ejemplo, #if 'a' == 41 ... #else ... #endif) para hacer esto en lugar de ramas dinámicas para que no reciba advertencias como estas . Funcionaría eso?
templatetypedef

Respuestas:

116

0xc1es el EBCDICcódigo del juego de caracteres paraA . El autor está probando una máquina así.

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

Richard Hodges
fuente
14
"¿Hay una forma mejor que esta para comprobar el juego de caracteres?" No existe una forma estándar de hacerlo. En C11, hay una manera de verificar si se están utilizando ciertas codificaciones Unicode, pero MSVC ni siquiera será totalmente compatible con C99 (que es anterior a C11). "¡Qué común es este conjunto de caracteres alternativo!" ¿Además de los mainframes de IBM? De ningún modo.
2
Entonces, ¿para qué sirve la elserama final ? ¿Existe una codificación de caracteres aún en uso que no sea compatible ni con ASCII ni con EBCDIC?
dan04
8
@ dan04 Ninguno que yo sepa, pero de manera realista podría ser tan simple como una rama de "codificación desconocida, mensaje de error de impresión".
8
'A' también es 0xC1 en la codificación de caracteres de Apple II DOS 3.3, que es ASCII OR con 0x80.
Damian Yerrick
2
@Rhymoid Existe una gran posibilidad de que Microsoft implemente C11 antes de admitir C99. Fueron uno de los proveedores que rechazaron las características difíciles de implementar C99, dos de las cuales ya no son obligatorias en C11 en.wikipedia.org/wiki/… .
Steve Cox
11

A primera vista puede parecer que es un código muerto, pero 'A' == 0x41 no siempre devolverá verdadero.

lo que el desarrollador intentó hacer aquí es encontrar perezosamente qué codificación es la máquina que implementa ASCII o cualquier variante de EBCDIC

como sugirió @Richard, Capital a se asigna a 0xc1 en el código de intercambio decimal codificado en binario extendido internacional, consulte la tabla a continuación en la rama 2 de if else ...

ingrese la descripción de la imagen aquí

ASCII podría encontrar otro valor diferente, por ejemplo:

ingrese la descripción de la imagen aquí

bien podría haber hecho:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
fuente
En el segundo párrafo, ¿quiso decir EBCDIC en lugar de EBDIC?
Zze