Je regardais du code C ++ et j'ai trouvé la construction suivante:
if('A' == 0x41) {
// ...
} else if('A' == 0xc1) {
// ...
} else {
// ...
}
Je reçois un avertissement Visual Studio disant:
Avertissement L'expression conditionnelle C4127 est constante.
Visual Studio a clairement raison - sûrement «A» est défini comme 0x41. Pourquoi l'auteur écrit-il ce code, étant donné que deux des trois branches sont du code mort?
#define IS_CHSET_EBCDIC ('A' == 0xc1)
etc .; ou, en C ++ moderne, en faire unconstexpr
.Réponses:
0xc1
est leEBCDIC
code de jeu de caractères pourA
. L'auteur teste une telle machine.http://www.ibm.com/support/knowledgecenter/en/SSGH4D_15.1.3/com.ibm.xlf1513.aix.doc/language_ref/asciit.html
la source
else
branche? Existe-t-il un encodage de caractères encore utilisé qui n'est compatible ni avec ASCII ni avec EBCDIC?À première vue, cela pourrait ressembler à du code mort, mais 'A' == 0x41 ne retournera pas toujours vrai.
ce que le développeur a essayé de faire ici est de trouver paresseusement quel encodage est la machine implémentant ASCII ou toute variante d' EBCDIC
comme @Richard l'a suggéré, Capital a est mappé à 0xc1 dans le code d'échange décimal codé binaire international étendu, voir le tableau ci-dessous dans la branche 2 de if else ...
une autre valeur différente pourrait être trouvée par ASCII par exemple:
il aurait aussi bien pu faire:
la source