문제

나는 왜 C++ 표준 라이브러리가 basic_[io]stream과 그 모든 변형을 인스턴스화했는지 항상 궁금했습니다. char 대신에 입력하세요. unsigned char 유형. char 이는 (서명 여부에 따라) get()과 같은 작업에 대한 오버플로 및 언더플로가 있을 수 있음을 의미하며, 이는 관련 변수의 구현 정의 값으로 연결됩니다.또 다른 예는 형식화되지 않은 바이트를 해당 형식을 사용하여 ostream으로 출력하려는 ​​경우입니다. put 기능.

어떤 아이디어가 있나요?


메모:나는 아직도 확신하지 못합니다.따라서 최종 답변을 알고 있다면 실제로 게시할 수 있습니다.

도움이 되었습니까?

해결책

아마도 질문을 오해했을 수도 있지만 unsigned char에서 char로의 변환은 지정되지 않은 것이 아니며 구현에 따라 다릅니다(C++ 표준의 4.7-3).

C++에서 1바이트 문자의 유형은 "unsigned char"가 아니라 "char"입니다.이는 플랫폼에서 최선의 작업을 수행할 수 있는 구현을 조금 더 자유롭게 제공합니다(예를 들어 표준 기관에서는 부호 있는 바이트 산술이 부호 없는 바이트 산술보다 빠른 CPU가 있다고 믿었을 수 있지만 이는 내 입장에서는 추측입니다).또한 C와의 호환성을 위해.C++에서 이런 종류의 존재적 불확실성을 제거한 결과가 C#입니다 ;-)

"char" 유형이 존재한다는 점을 감안할 때 부호가 정의되지 않은 경우에도 일반 스트림에서 이를 사용하는 것이 합리적이라고 생각합니다.그렇다면 귀하의 질문은 "왜 C++에서는 char를 서명되지 않은 것으로 정의하지 않았나요?"에 대한 대답으로 답할 수 있습니다.

다른 팁

나는 항상 이렇게 이해해 왔습니다.의 목적 iostream 클래스는 문자 스트림을 읽거나 쓰는 것입니다. 생각해 보면 문자 인코딩을 사용하여 컴퓨터에 의해서만 표현되는 추상 엔터티입니다.C++ 표준은 "문자로 선언된 개체(char)는 C++ 언어를 정의하기 위해 "구현 기본 문자 집합"을 강제할 필요가 없기 때문에 구현의 기본 문자 집합의 모든 멤버를 저장할 수 있을 만큼 충분히 커야 합니다.표준은 결정을 남길 수 있습니다 어느 문자 인코딩은 구현(STL 구현과 함께 컴파일러)에 사용됩니다. char 객체는 일부 인코딩에서 단일 문자를 나타냅니다.

구현 작성자는 다음과 같은 단일 옥텟 인코딩을 선택할 수 있습니다. ISO-8859-1 또는 다음과 같은 이중 옥텟 인코딩도 가능합니다. UCS-2.그것은 중요하지 않습니다.한 char 객체는 "구현의 기본 문자 집합의 모든 구성원을 저장할 수 있을 만큼 충분히 큽니다."(이것은 명시적으로 금지됩니다.) 가변 길이 인코딩), 구현 시 일반적인 인코딩과 호환되지 않는 방식으로 기본 라틴어를 나타내는 인코딩을 선택할 수도 있습니다!

혼란스럽다. char, signed char, 그리고 unsigned char 유형은 이름에 "char"를 공유하지만 다음 사항을 명심하는 것이 중요합니다. char 와 동일한 기본 유형 계열에 속하지 않습니다. signed char 그리고 unsigned char. signed char 부호 있는 정수 유형 계열에 속합니다.

4개가 있다 부호 있는 정수 유형:"signed char", "short int", "int" 및 "long int"입니다.

그리고 unsigned char 부호 없는 정수 유형 계열에 속합니다.

각각의 부호 있는 정수 유형에 대해 해당하는(그러나 다른) 유형이 존재합니다. 부호 없는 정수 유형:"부호 없는 문자", "부호 없는 짧은 정수", "부호 없는 정수", "부호 없는 긴 정수"...

의 한 가지 유사점은 char, signed char, 그리고 unsigned char 유형은 "[그들은] 동일한 양의 저장 공간을 차지하고 동일한 정렬 요구 사항을 갖는다"는 것입니다.따라서 다음을 수행할 수 있습니다. reinterpret_cast ~에서 char * 에게 unsigned char * 실행 문자 세트에서 문자의 숫자 값을 결정하기 위해.

귀하의 질문에 대답하기 위해 STL이 사용하는 이유 char 기본 유형은 표준 스트림이 다음과 같이 표시되는 문자 스트림을 읽거나 쓰기 위한 것이기 때문입니다. char 정수가 아닌 객체(signed char 그리고 unsigned char).사용 char 숫자 값과 비교하는 것은 문제를 분리하는 방법입니다.

char은 문자용이고, unsigned char은 데이터의 원시 바이트용이고, signed char는 서명된 데이터용입니다.

표준은 char 구현에 signed 또는 unsigned char이 사용될지 여부를 지정하지 않습니다. 이는 컴파일러에 따라 다릅니다.이는 단지 "char"가 시스템에서 문자를 보유하기에 "충분"하다는 점만 지정합니다. 즉, 당시의 문자 방식, 즉 유니코드가 없는 방식입니다.

문자에 "char"를 사용하는 것이 표준 방법입니다.unsigned char을 사용하는 것은 해킹이지만 대부분의 플랫폼에서 컴파일러의 char 구현과 일치합니다.

제 생각에는 이것 댓글이 잘 설명해줍니다.인용하자면:

signed char 및 unsigned char는 int 및 unsigned int와 마찬가지로 산술 정수 유형입니다.반면에 char은 플랫폼의 일부 불투명한 시스템별 기본 데이터 단위를 나타내는 "I/O" 유형으로 명시적으로 사용됩니다.나는 이런 정신으로 그것들을 사용할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top