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
--하지만 그 이후로는0xff
CHAR_MAX를합니다(CHAR_MAX를 로 합니다).CHAR_BIT==8
)의 결과는 구현 정의입니다.대부분의 구현에서 그 결과는 다음과 같습니다.-1
0xff == 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는 서명되지 않습니다.
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
'programing' 카테고리의 다른 글
C 프로그래밍: 다른 함수의 malloc() (0) | 2022.08.17 |
---|---|
소품을 사용하여 v-model을 초기화하시겠습니까? (0) | 2022.08.17 |
vuex: 상태 필드 "foo"가 "foo"에서 이름이 같은 모듈에 의해 재정의되었습니다. (0) | 2022.08.16 |
vue 컴포넌트와 앱에서 el과 template의 차이점은 무엇입니까? (0) | 2022.08.16 |
Java에서 문자열의 첫 글자를 대문자로 표시하는 방법은 무엇입니까? (0) | 2022.08.16 |