Чому символ "А" порівнюють з 0x41?


89

Я переглядав якийсь C ++ код і знайшов таку конструкцію:

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

Я отримую попередження Visual Studio про те, що:

Попередження Умовний вираз C4127 є постійним.

Visual Studio явно має рацію - безумовно, "A" визначається як 0x41. Чому автор пише цей код, враховуючи, що дві з трьох гілок є мертвим кодом?


30
Вони не обов'язково є мертвим кодом, можливо, це просто хитрий спосіб перевірити набір символів.
Джордж

60
'A' = C1 в EBCDIC
гарольд

14
Я б помістив його в заголовок утиліти як #define IS_CHSET_EBCDIC ('A' == 0xc1)тощо; або, в сучасному C ++, зробіть це a constexpr.
Пітер - Відновити Моніку

8
@ b.buchhold - Ні, ви можете перевести компіляцію з ПК на мейнфрейм. Отже, "А" має означати значення символу у наборі символів виконання.
Бо Перссон,

2
Здається, це найкраще зробити за допомогою умовного включення препроцесора (наприклад, #if 'a' == 41 ... #else ... #endif), щоб зробити це, а не динамічні гілки, щоб ви не отримували подібних попереджень . Це спрацювало б?
templatetypedef

Відповіді:


116

0xc1- EBCDICкод набору символів для A. Автор тестує на таку машину.

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


14
"чи є кращий спосіб перевірити набір символів?" Не існує стандартного способу зробити це. У C11 існує спосіб перевірити, чи використовуються певні кодування Unicode, але MSVC навіть не повністю підтримує C99 (що передує C11). "Наскільки поширений цей альтернативний набір символів!" Окрім мейнфреймів IBM? Зовсім не.

2
То для чого кінцева elseгілка? Чи існує кодування символів, яке все ще використовується, не сумісне ні з ASCII, ні з EBCDIC?
dan04

8
@ dan04 Жоден, про який я знаю, але реально він може бути таким простим, як гілка "невідоме кодування, повідомлення про помилку друку".

8
"A" - це також 0xC1 в кодуванні символів DOS 3.3 Apple II DOS, що є ASCII АБО з 0x80.
Damian Yerrick

2
@Rhymoid Насправді є велика ймовірність того, що Microsoft впровадить C11, перш ніж коли-небудь підтримати C99. Вони були одним із постачальників, які відступили від важких для реалізації функцій C99, два з яких більше не є обов'язковими в C11 en.wikipedia.org/wiki/… .
Стів Кокс,

11

На перший погляд може здатися, що це мертвий код, але 'A' == 0x41 не завжди поверне істину.

що розробник намагався зробити тут, - це ліниво знайти, яке кодування - це машина, що реалізує ASCII або будь-який варіант EBCDIC

як @Richard запропонував Capital a відображається на 0xc1 у Міжнародному - Розширеному двійковому кодованому десятковому коді обміну див. таблицю нижче у 2 гілці if else ...

введіть тут опис зображення

інше інше значення може бути знайдене ASCII для прикладу:

введіть тут опис зображення

він міг також зробити:

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

У другому абзаці - ви мали на увазі EBCDIC замість EBDIC?
Zze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.