Warum sollte das Zeichen 'A' mit 0x41 verglichen werden?

89

Ich habe mir C ++ - Code angesehen und das folgende Konstrukt gefunden:

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

Ich erhalte eine Visual Studio- Warnung mit folgenden Worten:

Warnung Der bedingte Ausdruck C4127 ist konstant.

Visual Studio hat eindeutig Recht - sicherlich ist 'A' als 0x41 definiert. Warum schreibt der Autor diesen Code, da zwei der drei Zweige toter Code sind?

H Bellamy
quelle
30
Sie sind nicht unbedingt toter Code, vielleicht ist es nur eine blöde Art, den Zeichensatz zu überprüfen.
George
60
'A' = C1 in EBCDIC
Harold
14
Ich würde es in einen Utility-Header wie #define IS_CHSET_EBCDIC ('A' == 0xc1)usw.; oder machen Sie es in modernem C ++ zu einem constexpr.
Peter - Stellen Sie Monica
8
@ b.buchhold - Nein, Sie können die Kompilierung von einem PC auf den Mainframe übertragen. 'A' muss also den Wert des Zeichens im Ausführungszeichensatz bedeuten.
Bo Persson
2
Es scheint, dass dies am besten mit der bedingten Einbeziehung des Präprozessors (z. B. #if 'a' == 41 ... #else ... #endif) durchgeführt werden kann, anstatt dynamische Verzweigungen zu verwenden, damit Sie keine Warnungen wie diese erhalten . Funktioniert das?
Templatetypedef

Antworten:

116

0xc1ist der EBCDICZeichensatzcode für A. Der Autor testet für eine solche Maschine.

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

Richard Hodges
quelle
14
"Gibt es eine bessere Möglichkeit, den Zeichensatz zu überprüfen?" Es gibt keinen Standardweg dazu. In C11 gibt es eine Möglichkeit zu überprüfen, ob bestimmte Unicode-Codierungen verwendet werden, aber MSVC unterstützt C99 (vor C11) nicht einmal vollständig. "Wie häufig ist dieser alternative Zeichensatz!" Neben IBM Mainframes? Überhaupt nicht.
2
Wofür ist der letzte elseZweig? Gibt es eine noch verwendete Zeichenkodierung, die weder mit ASCII noch mit EBCDIC kompatibel ist?
Dan04
8
@ dan04 Keine, die ich kenne, aber es könnte realistisch so einfach sein wie ein Zweig "unbekannte Codierung, Druckfehlermeldung".
8
'A' ist auch 0xC1 in der Apple II DOS 3.3-Zeichencodierung, die ASCII ODER mit 0x80 ist.
Damian Yerrick
2
@ Rhymoid Es besteht tatsächlich eine gute Chance, dass Microsoft C11 implementiert, bevor es jemals C99 unterstützt. Sie waren einer der Anbieter, die sich gegen schwer zu implementierende C99-Funktionen gewehrt haben, von denen zwei in C11 en.wikipedia.org/wiki/… nicht mehr obligatorisch sind .
Steve Cox
11

Auf den ersten Blick mag das so aussehen, als wäre der Code tot, aber 'A' == 0x41 gibt nicht immer true zurück.

Was der Entwickler hier versucht hat, ist träge herauszufinden, welche Codierung der Computer ist, der ASCII oder eine andere Variante von EBCDIC implementiert

Wie @Richard vorgeschlagen hat, wird Capital a im International - Extended Binary Coded Decimal Interchange Code auf 0xc1 abgebildet ( siehe Tabelle unten im Zweig 2 des if else ...

Geben Sie hier die Bildbeschreibung ein

Ein anderer anderer Wert könnte von ASCII gefunden werden, zum Beispiel:

Geben Sie hier die Bildbeschreibung ein

er hätte genauso gut tun können:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
quelle
Im zweiten Absatz - meinten Sie EBCDIC anstelle von EBDIC?
Zze