문자 'A'가 0x41과 비교되는 이유는 무엇입니까?


89

일부 C ++ 코드를보고 다음 구문을 찾았습니다.

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

다음과 같은 Visual Studio 경고가 표시됩니다.

경고 C4127 조건식이 일정합니다.

Visual Studio가 분명히 옳습니다-확실히 'A'는 0x41로 정의됩니다. 세 가지 중 두 가지가 죽은 코드라는 점을 감안할 때 작성자가이 코드를 작성하는 이유는 무엇입니까?


30
반드시 죽은 코드는 아니며 문자 집합을 확인하는 멍청한 방법 일 수도 있습니다.
George

60
'A'= EBCDIC의 C1
harold

14
나는 그것을 유틸리티 헤더 #define IS_CHSET_EBCDIC ('A' == 0xc1)등에 넣을 것이다 . 또는 최신 C ++에서 constexpr.
Peter-Monica 복원

8
@ b.buchhold-아니요, PC에서 메인 프레임으로 크로스 컴파일 할 수 있습니다. 따라서 'A'는 실행 문자 집합의 문자 값을 의미해야합니다.
Bo Persson 2016

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에는 특정 유니 코드 인코딩이 사용 중인지 확인하는 방법이 있지만 MSVC는 C99 (C11 이전)도 완전히 지원하지 않습니다. "이 대체 문자 세트는 얼마나 흔한가요!" IBM 메인 프레임 외에? 전혀.

2
그래서 마지막 else분기는 무엇입니까? ASCII 또는 EBCDIC와 호환되지 않는 여전히 사용중인 문자 인코딩이 있습니까?
dan04

8
@ dan04 내가 아는 바는 없지만 "알 수없는 인코딩, 인쇄 오류 메시지"분기처럼 현실적으로 간단 할 수 있습니다.

8
'A'는 Apple II DOS 3.3 문자 인코딩에서 0xC1이며 ASCII OR 0x80입니다.
Damian Yerrick 2016

2
@Rhymoid 실제로 Microsoft가 C99를 지원하기 전에 C11을 구현할 가능성이 있습니다. 그들은 C99 기능을 구현하기 어려운 것에 반대하는 벤더 중 하나였으며, 그 중 2 개는 더 이상 C11 en.wikipedia.org/wiki/… 에서 필수가 아닙니다 .
Steve Cox

11

언뜻보기에는 그것이 죽은 코드처럼 보일 수 있지만 'A'== 0x41이 항상 true를 반환하지는 않습니다 ..

개발자가 여기서 시도한 것은 ASCII 또는 다른 변형을 구현하는 시스템이 어떤 인코딩인지 느리게 찾는 것 입니다. EBCDIC의

@Richard가 제안했듯이 Capital aInternational-Extended Binary Coded Decimal Interchange Code의 0xc1 에 매핑됩니다 . if else의 2 분기에서 아래 표를 참조하십시오.

여기에 이미지 설명 입력

예를 들어 ASCII에서 다른 다른 값을 찾을 수 있습니다.

여기에 이미지 설명 입력

그는 다음과 같이 할 수있었습니다.

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

두 번째 단락에서-EBDIC 대신 EBCDIC을 의미 했습니까?
Zze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.