C/C++에서 unsigned char
는 무엇을 위해 사용됩니까? 정규 char
과 다른 점은 무엇입니까?
C++에는 세 가지 distinct 문자 유형이 있습니다.
char
signed char
_unsigned char
_text에 문자 유형을 사용하는 경우 규정되지 않은 char
을 사용하십시오.
'a'
_ 또는 _'0'
_과 같은 문자 리터럴 유형입니다."abcde"
_와 같은 C 문자열을 구성하는 유형입니다.또한 숫자 값으로도 작동하지만 해당 값이 부호있는 것으로 처리되는지 또는 부호없는 것으로 처리되는지는 지정되지 않습니다. 불평등을 통한 문자 비교에주의하십시오. 비록 자신을 ASCII (0-127)로 제한하면 안전합니다.
문자 유형을 숫자로 사용하는 경우 다음을 사용하십시오.
signed char
_, 최소 -127 ~ 127 범위를 제공합니다. (-128 ~ 127이 일반적 임)unsigned char
_, 최소 0 ~ 255 범위를 제공합니다."적어도"C++ 표준은 각 숫자 유형이 포함하는 데 필요한 최소 범위의 값만 제공하기 때문입니다. sizeof (char)
은 1 (즉, 1 바이트)이어야하지만 이론적으로 바이트는 예를 들어 32 비트 일 수 있습니다. sizeof
의 크기는 여전히 _1
로보고됩니다. could는 sizeof (char) == sizeof (long) == 1
이 있음을 의미합니다.
C 표준은 char
의 서명 된 값을 정의하지 않으므로 구현에 따라 다릅니다. 플랫폼에 따라 char은 signed
또는 unsigned
일 수 있으므로 구현에 따라 다르면 signed char
또는 unsigned char
를 명시 적으로 요청해야합니다. 문자열에서 문자를 표현하려는 경우 char
을 사용하십시오. 이는 플랫폼이 문자열에 넣는 것과 일치합니다.
signed char
와 unsigned char
의 차이는 예상대로입니다. 대부분의 플랫폼에서 signed char
는 8 비트 2의 보수로 -128
에서 127
까지이며 unsigned char
는 8 비트 부호없는 정수 (0
에서 255
)입니다. 표준에서는 char
유형에 8 비트가 필요하지 않으며 sizeof(char)
만 1
을 반환합니다. CHAR_BIT
에 limits.h
가있는 문자의 비트 수를 얻을 수 있습니다. 이 플랫폼이 오늘날 8
이외의 다른 플랫폼이 될 수도 있습니다.
이 문제에 대한 좋은 요약이 있습니다. here .
내가 게시 한 이후로 다른 사람들이 언급했듯이 작은 정수를 나타내고 자한다면 int8_t
와 uint8_t
를 사용하는 것이 좋습니다.
나는 그것이 실제로 요구된다고 생각하기 때문에 C와 C++의 규칙을 말하고 싶습니다 (이 점에서 동일합니다). 먼저, unsigned char
의 모든 비트는 부호없는 char 객체가 있는지 값을 결정하는 데 참여합니다. 둘째, unsigned char
은 명시 적으로 서명되지 않은 것으로 표시됩니다.
이제 int 유형의 -1
값을 unsigned char
(으)로 변환 할 때 발생하는 일에 대해 누군가와 토론했습니다. 그는 결과 unsigned char
에 부호 표현이 걱정되어 모든 비트가 1로 설정되어 있다는 생각을 거부했습니다. 그러나 그는 필요하지 않습니다. 이 규칙에서 즉시 전환이 의도 한대로 수행됩니다.
새 유형에 부호가없는 경우 값이 새 유형의 범위에 올 때까지 새 유형에 표시 될 수있는 최대 값보다 하나 이상을 반복적으로 더하거나 빼서 값이 변환됩니다. (C99 초안에
6.3.1.3p2
)
그것은 수학적 설명입니다. C++은 모듈러스 미적분학으로 설명하며 동일한 규칙을 산출합니다. 어쨌든 not 보장되는 것은 정수 -1
의 모든 비트가 변환 전에 하나라는 것입니다. 따라서 결과 unsigned char
에 모든 CHAR_BIT
비트가 1로 설정되었다고 주장 할 수있는 것은 무엇입니까?
UCHAR_MAX+1
에 -1
에 한 번만 추가하면 범위의 값, 즉 UCHAR_MAX
이 생성됩니다.실제로 충분합니다! 따라서 모든 비트가 1 인 unsigned char
를 원할 때마다
unsigned char c = (unsigned char)-1;
또한 변환은 not 상위 비트를 잘라내는 것입니다. two의 보수에 대한 운이 좋은 사건은 그것이 잘림 일 뿐이지 만 다른 부호 표현에 대해서도 반드시 같은 것은 아닙니다.
unsigned char의 사용 예는 다음과 같습니다.
unsigned char은 자주 컴퓨터 그래픽에서 사용되는데, (항상 그런 것은 아니지만) 각 색상 구성 요소에 싱글 바이트를 할당합니다. RGB (또는 RGBA) 색이 각각 24 비트 (또는 32 비트)로 표현되는 것이 일반적입니다. 각 비트는 부호없는 문자입니다. unsigned char 값은 [0,255] 범위에 있으므로 값은 일반적으로 다음과 같이 해석됩니다.
따라서 RGB 빨강은 (255,0,0) -> (100 % 빨강, 0 % 녹색, 0 % 파랑)으로 끝납니다.
signed char을 사용하지 않는 이유는 무엇입니까? 산술 및 비트 시프트는 문제가됩니다. 이미 설명했듯이 signed char 범위는 기본적으로 -128만큼 이동합니다. RGB를 그레이 스케일로 변환하는 아주 간단하고 순진한 (주로 사용하지 않는) 방법은 세 가지 색상 구성 요소 모두를 평균화하는 것이지만 색상 구성 요소의 값이 음수이면 문제가 발생합니다. unsigned char arithmetic을 사용할 때 빨간색 (255, 0, 0)은 (85, 85, 85)로 평균화됩니다. 그러나 값이 signed chars (127, -128, -128)이면 (-99, -99, -99)로 끝나고 (29, 29, 29) unsigned char space에 잘못되었습니다.
문자를 작은 정수로 사용하려면 가장 안전한 방법은 int8_t
및 uint8_t
형식을 사용하는 것입니다.
signed char
의 범위는 -128에서 127 사이입니다. unsigned char
의 범위는 0에서 255까지입니다.
char
은 컴파일러에 따라 signed char 또는 unsigned char와 같지만 고유 한 유형입니다.
C 스타일 문자열을 사용하는 경우 char
을 사용하면됩니다. 산술 (꽤 드물다)에 문자를 사용해야하는 경우, 이식성을 위해 명시 적으로 부호가 지정되거나 서명되지 않은 기호를 지정하십시오.
char
및 unsigned char
는 모든 플랫폼에서 8 비트 유형으로 보장되지는 않으며 8 비트 이상으로 보장됩니다. 일부 플랫폼에는 9 비트, 32 비트 또는 64 비트 바이트 가 있습니다. 그러나 오늘날 가장 일반적인 플랫폼 (Windows, Mac, Linux x86 등)은 8 비트 바이트입니다.
직접 값의 관점에서 볼 때 정규 char은 CHAR_MIN
와 CHAR_MAX
사이에 값이있는 것으로 알려져 있지만 unsigned char는 양수 끝에 두 배의 범위를 제공합니다. 예를 들어 CHAR_BIT
이 8 인 경우 일반 char
의 범위는 [0, 127] (부호가 있거나 부호가 없으므로) 만 보장되며 unsigned char
는 [0, 255]이고 signed char
는 [-127, 127 ].
이 표준을 사용하면 POD (일반 오래된 데이터)의 객체를 부호없는 char 배열로 직접 변환 할 수 있습니다. 이를 통해 객체의 표현과 비트 패턴을 검사 할 수 있습니다. char 또는 signed char에 대해 동일한 유형의 안전한 유형의 문장 보호가 존재하지 않습니다.
unsigned char
는 양의 값만 취합니다 .... 0 - 255
어디로
signed char
는 양수 값과 음수 값을 모두 취합니다 .... -128 ~ +127
Unsigned char (부호없는) 바이트 값 (0에서 255)입니다. "캐릭터"라는 측면에서 "숯"을 생각할 수도 있지만 실제로는 수치입니다. 일반 "char"이 서명되어 있으므로 128 개의 값이 있으며이 값은 ASCII encoding을 사용하여 문자로 매핑됩니다. 그러나 두 경우 모두 메모리에 저장하는 값은 바이트 값입니다.
특정 길이와 부호의 다양한 유형을 사용하고 싶다면 uint8_t, int8_t, uint16_t 등을 사용하는 것이 더 효과적 일 것입니다.
부호없는 char은 일반 char의 부호를 위해 예약 된 비트를 다른 숫자로 사용합니다. 이렇게하면 범위가 [-128 - 127]이 아닌 [0 - 255]로 변경됩니다.
서명하지 않으려는 경우 일반적으로 서명되지 않은 문자가 사용됩니다. char를 숫자로 사용하는 대신 char을 바이트로 처리 할 때 비트 이동 (시프트 확장) 및 기타 작업을 수행 할 때 차이가 있습니다.
unsigned char는 모든 비트 속임의 핵심입니다. 모든 플랫폼 용 거의 모든 컴파일러에서 unsigned char는 단순히 BYTE입니다. 일반적으로 8 비트의 부호없는 정수입니다. 작은 정수 또는 비트 팩으로 처리 할 수 있습니다.
중독에서 다른 사람이 말했듯이, 표준은 숯의 기호를 정의하지 않습니다. 그래서 당신은 char, signed char, unsigned char의 3 가지 "char"타입을 가지고 있습니다.
일부 인터넷 검색은 this 을 발견했습니다. 여기서 사람들은 이에 대해 토론했습니다.
부호없는 문자는 기본적으로 단일 바이트입니다. 따라서 1 바이트의 데이터가 필요한 경우이를 사용합니다 (예 : Windows API에서 자주 수행되는 것처럼 플래그를 사용하여 함수에 전달되도록 설정하는 등).
부호없는 char은 양의 값만 취합니다 : 0에서 255 signed char는 양수 값과 음수 값을 취합니다. -128에서 +127까지
frome "c 프로그래밍 laugage"책 인용 :
한정자 signed
또는 unsigned
은 char 또는 정수에 적용될 수 있습니다. 부호없는 숫자는 항상 양수 또는 0이며 modulo 2 ^ n의 법칙을 준수합니다. 여기서 n은 해당 유형의 비트 수입니다. 예를 들어 문자가 8 비트이면 부호없는 char 변수는 0에서 255 사이의 값을 가지며 부호있는 문자는 -128에서 127 사이의 값을 갖습니다 (2의 보수 시스템에서). 일반 문자가 부호가 있거나 서명이없는 것은 machine 의존적이지만 인쇄 가능한 문자는 항상 양수입니다.