signed char / unsigned char형
int형과는 달리 char형은 signed인지 unsigned인지 미리 정해져 있지 않다.
그 이유는 C++ 시스템 개발자가 하드웨어의 특성에 맞추어 알맞은 char형을 정할 수 있도록 하기 위한 배려이다.
그러나 char형이 어느 특별한 한 가지 행동만을 보여야 한다면 명시적으로 signed과 unsigned을 제한할 수 있다.
🟣 char cpp; ➡️ signed 또는 unsigned형
🟣 unsigned char c; ➡️ 명백히 unsigned형
🟣 signed char pp; ➡️ 명백히 signed형
이런 구분은 char형으로 수를 나타내고자 할 때 중요하다.
unsigned char형은 0에서 255까지의 범위를 나타낼 수 있고, signed char형은 -128부터 127까지의 범위를 나타낼 수 있다.
🔹 Ex) 200정도 되는 값을 char형 변수에 저장한다면 어떤 시스템에서는 동작하지만 다른 시스템에서는 동작하지 않을 것이다. 같은 값을 unsigned char형에 저장한다면 어느 시스템에서나 무리 없이 동작할 것이다.
표준 ASCII 문자를 char형 변수에 저장할 때에는 signed형이나 unsigned형이나 상관이 없으므로 char라고 쓰면 된다.
확장 char형: wchar_t
때때로 프로그램이 1바이트(8비트)로 표현할 수 없는 문자 세트(ex 일본어, 중국어, 한국어 문자 세트)를 처리해야 하는 경우도 있다.
C++는 이것을 두 가지 방법으로 처리한다.
1️⃣ 확장 문자 세트가 시스템의 기본 문자 세트이면 컴파일러 개발업체가 char형을 처음부터 2바이트(16비트) 또는 그 이상으로 만든다.
2️⃣ 기본 문자 세트와 확장 문자 세트를 동시에 지원. (즉 보통의 8비트 char형으로 기본 문자 세트를 나타내고, wchar_t [wide character type에서 w, char, t를 따 왔다] 으로 확장 문자 세트를 나타내는 것이다.
wchar_t형은 시스템에서 사용되는 가장 큰 확장 문자 세트를 나타낼 수 있을 만큼의 충분한 비트 폭을 가진 정수형이다.
wchar_t형은 기초 데이터형(underlying type)이라고 부르는 정수형과 동일한 크기와 부호 속성을가진다.
기초 데이터형은 시스템에 따라 unsigned short형일 수도 있고, int형이 될 수도 있다.
cin과 cout은 입출력을 char형 문자의 스트림으로 간주하기 때문에 wchar_t형을 처리하지 못한다.
최신 버전의 iostream 헤더 파일은 wchar_t형 문자의 스트림을 처리하기 위해 wcin과 wcout 객체를 제공한다.
그리고 확장 문자 상수나 확장 문자열은 그 앞에 L을 붙여서 나타낸다.
wchar_t bob = L'P'; ➡️ 확장 문자 상수
wout << L"tall" << endl; ➡️확장 문자 문자열의 출력
✅ 변수 bob에 문자 P의 wchar_t형 버전을 저장하고, 단어 tall의 wchar_t형 버전을 디스플레이한다. 2바이트 wchar_t형을 사용하는 시스템에서, 각 문자에 2바이트씩 대입하여 메모리에 저장한다.
char16_t, char32_t
특별한 경우에 문자열을 반환할 때 길이와 부호가 고정될 필요가 있는데, wchar_t의 부호와 길이는 가변이기 때문에 문제가 발생할 수 있다. 이것을 해결하기 위해 C++11에서는 unsigned 16비트형인 char16_t와 unsigned 32비트형인 char32_t를 소개하고 있다.
char16_t 변수형
- u'C' 또는 u"be good" 과 같이 접두사를 u로 사용함
- /u00F6 형태의 유니버셜 문자이름과 매칭됨
- 접두사u는 char16_t 변수형의 문자 상수를 지시할 때 사용됨
char16_t ch1 = u'q'; ➡️ 기본 16비트 문자
char32_t 변수
- U'R' 또는 U"be happy" 과 같이 접수사로 U를 사용함
- /U0000222B 형태의 유니버셜 문자이름과 매칭됨
- 접두사U는 char32_t 변수형의 문자 상수를 지시할 때 사용됨
char32_t ch2 = U'\U000022B' ➡️ 32비트 유니버셜 문자 이름
출처 및 참고 : C++ 기초 플러스
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)