Perché il carattere "A" dovrebbe essere confrontato con 0x41?


89

Stavo guardando un po 'di codice C ++ e ho trovato il seguente costrutto:

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

Ottengo un avviso di Visual Studio che dice:

Avvertenza L'espressione condizionale C4127 è costante.

Visual Studio ha chiaramente ragione: sicuramente "A" è definito come 0x41. Perché l'autore scrive questo codice, dato che due dei tre rami sono codice morto?


30
Non sono necessariamente codice morto, forse è solo un modo stupido per controllare il set di caratteri.
George

60
'A' = C1 in EBCDIC
Harold

14
Lo metterei in un'intestazione di utilità come #define IS_CHSET_EBCDIC ('A' == 0xc1)ecc .; oppure, nel moderno C ++, rendilo un file constexpr.
Peter - Ripristina Monica il

8
@ b.buchhold - No, puoi eseguire la compilazione incrociata da un PC al mainframe. Quindi "A" deve indicare il valore del carattere nel set di caratteri di esecuzione.
Bo Persson

2
Sembra che questo potrebbe essere fatto meglio usando l'inclusione condizionale del preprocessore (ad esempio #if 'a' == 41 ... #else ... #endif) per farlo invece di rami dinamici in modo da non ricevere avvisi come questi . Funzionerebbe?
templatetypedef

Risposte:


116

0xc1è il EBCDICcodice del set di caratteri per A. L'autore sta testando una macchina del genere.

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


14
"c'è un modo migliore di questo per controllare il set di caratteri?" Non esiste un modo standard per farlo. In C11, c'è un modo per verificare se vengono utilizzate determinate codifiche Unicode, ma MSVC non supporterà nemmeno completamente C99 (che precede C11). "Quanto è comune questo set di caratteri alternativo!" Oltre ai mainframe IBM? Affatto.

2
Allora a cosa serve il elseramo finale ? Esiste una codifica dei caratteri ancora in uso che non è compatibile né con ASCII né con EBCDIC?
dan04

8
@ dan04 Nessuno che io sappia, ma potrebbe realisticamente essere semplice come un ramo "codifica sconosciuta, messaggio di errore di stampa".

8
'A' è anche 0xC1 nella codifica dei caratteri Apple II DOS 3.3, che è ASCII OR con 0x80.
Damian Yerrick

2
@Rhymoid In realtà ci sono buone probabilità che Microsoft implementerà C11 prima di supportare C99. Sono stati uno dei fornitori che hanno respinto le funzionalità C99 difficili da implementare, due delle quali non sono più obbligatorie in C11 en.wikipedia.org/wiki/… .
Steve Cox

11

A prima vista potrebbe sembrare che sia un codice morto, ma 'A' == 0x41 non sempre restituirà true ..

quello che lo sviluppatore ha cercato di fare qui è stato trovare pigramente quale codifica è la macchina che implementa ASCII o qualsiasi variante di EBCDIC

come suggerito da @Richard, la Capitale a è mappata su 0xc1 nel codice di interscambio decimale con codifica binaria internazionale estesa, vedere la tabella sotto nel ramo 2 di if else ...

inserisci qui la descrizione dell'immagine

un altro valore diverso potrebbe essere trovato da ASCII per esempio:

inserisci qui la descrizione dell'immagine

avrebbe anche potuto fare:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}

Nel secondo paragrafo - intendevi EBCDIC invece di EBDIC?
Zze
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.