Dlaczego znak „A” miałby być porównywany z 0x41?

89

Patrzyłem na kod w C ++ i znalazłem następującą konstrukcję:

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

Otrzymuję ostrzeżenie programu Visual Studio o treści:

Ostrzeżenie Wyrażenie warunkowe C4127 jest stałe.

Visual Studio ma rację - z pewnością „A” jest zdefiniowane jako 0x41. Dlaczego autor pisze ten kod, skoro dwie z trzech gałęzi to martwy kod?

H Bellamy
źródło
30
Niekoniecznie są martwym kodem, być może to po prostu głupi sposób na sprawdzenie zestawu znaków.
George
60
„A” = C1 w EBCDIC
harold
14
Umieściłbym to w nagłówku narzędzia, jak #define IS_CHSET_EBCDIC ('A' == 0xc1)itp .; lub, we współczesnym C ++, zrób to constexpr.
Peter - Przywróć Monikę
8
@ b.buchhold - Nie, możesz skompilować krzyżowo z komputera PC na komputer mainframe. Zatem „A” musi oznaczać wartość znaku w zestawie znaków wykonania.
Bo Persson
2
Wygląda na to, że najlepiej to zrobić używając warunkowego włączenia preprocesora (np. #If 'a' == 41 ... #else ... #endif) zamiast dynamicznych gałęzi, aby nie otrzymywać takich ostrzeżeń . Czy to zadziała?
templatetypedef

Odpowiedzi:

116

0xc1to EBCDICkod zestawu znaków dla A. Autor testuje taką maszynę.

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

Richarda Hodgesa
źródło
14
„Czy istnieje lepszy sposób sprawdzenia zestawu znaków?” Nie ma na to standardowego sposobu. W C11 istnieje sposób sprawdzenia, czy używane są pewne kodowania Unicode, ale MSVC nie będzie nawet w pełni obsługiwać C99 (który jest starszy od C11). „Jak powszechny jest ten alternatywny zestaw znaków!” Oprócz komputerów mainframe IBM? Ani trochę.
2
Więc po co jest ostatnia elsegałąź? Czy nadal jest używane kodowanie znaków, które nie jest zgodne ani z ASCII, ani z EBCDIC?
dan04
8
@ dan04 Żadne, o których wiem, ale realnie mogłoby to być tak proste, jak gałąź „nieznane kodowanie, drukowanie komunikatu o błędzie”.
8
„A” to także 0xC1 w kodowaniu znaków Apple II DOS 3.3, co oznacza ASCII OR z 0x80.
Damian Yerrick
2
@Rhymoid W rzeczywistości istnieje duża szansa, że ​​Microsoft zaimplementuje C11, zanim kiedykolwiek będzie obsługiwał C99. Byli jednym z dostawców, którzy odepchnęli się od trudnych do zaimplementowania funkcji C99, z których dwie nie są już obowiązkowe w C11 en.wikipedia.org/wiki/… .
Steve Cox
11

Na pierwszy rzut oka może się wydawać, że jest to martwy kod, ale „A” == 0x41 nie zawsze zwróci prawdę.

programista próbował tutaj leniwie znaleźć kodowanie maszyny implementującej ASCII lub dowolny wariant EBCDIC

jak zasugerował @Richard, kapitał a jest mapowany na 0xc1 w międzynarodowym - rozszerzonym kodowanym binarnym kodzie dziesiętnym - patrz tabela poniżej w gałęzi 2 instrukcji if else ...

wprowadź opis obrazu tutaj

inną inną wartość można znaleźć w ASCII, na przykład:

wprowadź opis obrazu tutaj

mógł równie dobrze zrobić:

if('p' == 0x70) {
  // ...
} else if('p' == 0x97) {
  //...
}
ΦXocę 웃 Пepeúpa ツ
źródło
W drugim akapicie - czy miałeś na myśli EBCDIC zamiast EBDIC?
Zze