programing

C 또는 C++ 표준에서는 char를 부호 있는 문자 또는 부호 없는 문자로 명시적으로 정의하지 않는 이유는 무엇입니까?

bestcode 2022. 8. 17. 23:48
반응형

C 또는 C++ 표준에서는 char를 부호 있는 문자 또는 부호 없는 문자로 명시적으로 정의하지 않는 이유는 무엇입니까?

int main()
{
    char c = 0xff;
    bool b = 0xff == c;
    // Under most C/C++ compilers' default options, b is FALSE!!!
}

C 또는 C++ 표준에서는 char를 부호화 또는 부호 없음으로 지정하지 않습니다.이것은 구현 정의되어 있습니다.

왜 C/C++ 규격에서는 위의 코드와 같은 위험한 오용을 피하기 위해 char를 signed 또는 unsigned로 명시적으로 정의하지 않는가?

역사적 이유 때문이지

유형의 표현char로 승진하다int(많은 CPU에는 8비트 산술 연산이 없기 때문에) 대부분의 컨텍스트에서 사용됩니다.일부 시스템에서는 부호 확장이 이를 위한 가장 효율적인 방법이며, 이는 명확하게 해야 한다고 주장한다.char서명된.

한편, EBCD는IC 문자 집합에는 상위 비트 집합의 기본 문자(즉, 값이 128 이상인 문자)가 있습니다.EBCDIC 플랫폼에서는,char대부분 서명하지 않은 상태여야 해요

ANSI C 논거(1989년 표준의 경우)는 이 주제에 대해 언급할 것이 많지 않다. 섹션 3.1.2.5는 다음과 같이 말한다.

다음 세 가지 유형의 문자가 지정됩니다.signed, 플레인 및unsigned평야char이전 관행과 같이 구현에 따라 서명 또는 서명되지 않은 것으로 표시될 수 있습니다.종류signed char는 부호 없는 일반 문자를 구현하는 시스템에서 1바이트 부호 있는 정수 유형을 사용할 수 있도록 하기 위해 도입되었습니다.대칭의 이유로 키워드는signed는, 다른 적분 타입의 타입명의 일부로서 사용할 수 있습니다.

더 나아가 1975년 C 참조 매뉴얼의 초기 버전에는 다음과 같이 기술되어 있습니다.

A char오브젝트는 어디에서나 사용할 수 있다int아마도요.모든 경우char로 변환됩니다.int그 부호를 결과 정수의 상위 8비트를 통해 전파합니다.이는 문자와 정수에 사용되는 두 개의 보완 표현과 일치합니다(단, 다른 구현에서는 부호 전파 기능이 사라집니다).

이 설명은 이후의 문서에서 볼 수 있는 것보다 구현에 고유하지만 다음 사항을 인정합니다.char서명 또는 비서명일 수 있습니다.'기타 실시'에 대해서는 '표지 전파가 사라진다'는 취지의 추진char에 반대하다.int는 8비트의 표현을 0으로 하여 기본적으로 8비트의 부호 없는 양으로 취급합니다.(그 언어에는 아직signed또는unsigned키워드를 지정합니다).

C의 직전의 언어는 B라는 언어였다.B는 활자가 없는 언어였기 때문에, 의문은char서명 또는 서명되지 않은 것은 해당되지 않습니다.C의 초기 역사에 대한 자세한 내용은 고(故) 데니스 리치의 홈페이지, 이제 이곳으로 이사왔다.

코드 내에서 무슨 일이 일어나고 있는지에 대해서는 (현대 C 규칙을 적용)

char c = 0xff;
bool b = 0xff == c;

밋밋한 경우char시그니처가 없는 경우, 그 후 초기화됩니다.c로 설정하다(char)0xff이 값은 다음과 같습니다.0xff두 번째 줄에.하지만 만약 평범하다면char그럼 서명해 주세요.0xff(활자의 표현)int)로 변환됩니다.char--하지만 그 이후로는0xffCHAR_MAX를합니다(CHAR_MAX를 로 합니다).CHAR_BIT==8)의 결과는 구현 정의입니다.대부분의 구현에서 그 결과는 다음과 같습니다.-10xff == c가 로 int, , , , , , , , , , ,에 해당합니다.0xff == -1 , 「」255 == -1그건 물론 거짓이죠

주의할 은 '아까부터' 입니다.unsigned char,signed char및 (기호 , (기호)char세 가지 유형이 있습니다. char다음 중 하나와 같은 표현을 가지고 있다. unsigned char or or or openicle. signed char 실장 정의되어 있습니다signed int ★★★★★★★★★★★★★★★★★」int는, , 「2」입니다.unsigned int가 플레인(플레인)으로 는 구현 int 서명되어 있지 않습니다

네, 모두 조금 엉망진창입니다.C가 처음부터 설계되었다면 정의가 달라졌을 것입니다.그러나 C 언어의 각 리비전은 기존 코드를 깨는(너무 많은) 것을 방지하고 기존 구현의 정도를 줄여야 했습니다.

char처음에는 글자를 저장하기 위한 것이므로 서명이 있든 없든 상관없습니다.한 것은 인가 하는 것이다.char 적절한 것을 선택합니다.

ARMv4 이전 ARM에서는 하프워드와 서명된 바이트의 로딩이 네이티브하게 지원되지 않았습니다.서명된 바이트를 로드하려면 LDRB에 서명하고 값을 확장해야 합니다(LSL이 위로, ASR이 다시 아래로).이것은 고통스럽기 때문에 기본적으로 char는 서명되지 않습니다.

서명되지 않은 유형이 암 CPU에서 더 효율적인 이유는 무엇입니까?

ARM ARM을 사용하고 .unsigned char ISA에서할 수 이 입니다.

또한 대부분의 최신 컴파일러에서는 기본 설정을 사용하는 대신 문자 기호를 변경할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15533115/why-dont-the-c-or-c-standards-explicitly-define-char-as-signed-or-unsigned

반응형