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?


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


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) {
  //...
}

Im zweiten Absatz - meinten Sie EBCDIC anstelle von EBDIC?
Zze
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.