it-swarm-ko.tech

서명되지 않은 char이란 무엇입니까?

C/C++에서 unsigned char는 무엇을 위해 사용됩니까? 정규 char과 다른 점은 무엇입니까?

427
Landon Kuhn

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로보고됩니다. couldsizeof (char) == sizeof (long) == 1이 있음을 의미합니다.

520
Fruny

C 표준은 char의 서명 된 값을 정의하지 않으므로 구현에 따라 다릅니다. 플랫폼에 따라 char은 signed 또는 unsigned 일 수 있으므로 구현에 따라 다르면 signed char 또는 unsigned char를 명시 적으로 요청해야합니다. 문자열에서 문자를 표현하려는 경우 char을 사용하십시오. 이는 플랫폼이 문자열에 넣는 것과 일치합니다.

signed charunsigned char의 차이는 예상대로입니다. 대부분의 플랫폼에서 signed char는 8 비트 2의 보수로 -128에서 127까지이며 unsigned char는 8 비트 부호없는 정수 (0에서 255)입니다. 표준에서는 char 유형에 8 비트가 필요하지 않으며 sizeof(char)1을 반환합니다. CHAR_BITlimits.h가있는 문자의 비트 수를 얻을 수 있습니다. 이 플랫폼이 오늘날 8 이외의 다른 플랫폼이 될 수도 있습니다.

이 문제에 대한 좋은 요약이 있습니다. here .

내가 게시 한 이후로 다른 사람들이 언급했듯이 작은 정수를 나타내고 자한다면 int8_tuint8_t를 사용하는 것이 좋습니다.

79
Todd Gamblin

나는 그것이 실제로 요구된다고 생각하기 때문에 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로 설정되었다고 주장 할 수있는 것은 무엇입니까?

  1. 모든 비트는 값을 결정하는 데 참여합니다. 즉, 객체에서 패딩 비트가 발생하지 않습니다.
  2. UCHAR_MAX+1-1에 한 번만 추가하면 범위의 값, 즉 UCHAR_MAX이 생성됩니다.

실제로 충분합니다! 따라서 모든 비트가 1 인 unsigned char를 원할 때마다

unsigned char c = (unsigned char)-1;

또한 변환은 not 상위 비트를 잘라내는 것입니다. two의 보수에 대한 운이 좋은 사건은 그것이 잘림 일 뿐이지 만 다른 부호 표현에 대해서도 반드시 같은 것은 아닙니다.

34

unsigned char의 사용 예는 다음과 같습니다.

unsigned char은 자주 컴퓨터 그래픽에서 사용되는데, (항상 그런 것은 아니지만) 각 색상 구성 요소에 싱글 바이트를 할당합니다. RGB (또는 RGBA) 색이 각각 24 비트 (또는 32 비트)로 표현되는 것이 일반적입니다. 각 비트는 부호없는 문자입니다. unsigned char 값은 [0,255] 범위에 있으므로 값은 일반적으로 다음과 같이 해석됩니다.

  • 0은 주어진 색상 요소의 총 부족을 의미합니다.
  • 255는 주어진 색상 안료의 100 %를 의미합니다.

따라서 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에 잘못되었습니다.

24
Zachary Garrett

문자를 작은 정수로 사용하려면 가장 안전한 방법은 int8_tuint8_t 형식을 사용하는 것입니다.

12
jbleners

signed char의 범위는 -128에서 127 사이입니다. unsigned char의 범위는 0에서 255까지입니다.

char은 컴파일러에 따라 signed char 또는 unsigned char와 같지만 고유 한 유형입니다.

C 스타일 문자열을 사용하는 경우 char을 사용하면됩니다. 산술 (꽤 드물다)에 문자를 사용해야하는 경우, 이식성을 위해 명시 적으로 부호가 지정되거나 서명되지 않은 기호를 지정하십시오.

5
James Hopkin

charunsigned char는 모든 플랫폼에서 8 비트 유형으로 보장되지는 않으며 8 비트 이상으로 보장됩니다. 일부 플랫폼에는 9 비트, 32 비트 또는 64 비트 바이트 가 있습니다. 그러나 오늘날 가장 일반적인 플랫폼 (Windows, Mac, Linux x86 등)은 8 비트 바이트입니다.

5
bk1e

직접 값의 관점에서 볼 때 정규 char은 CHAR_MINCHAR_MAX 사이에 값이있는 것으로 알려져 있지만 unsigned char는 양수 끝에 두 배의 범위를 제공합니다. 예를 들어 CHAR_BIT이 8 인 경우 일반 char의 범위는 [0, 127] (부호가 있거나 부호가 없으므로) 만 보장되며 unsigned char는 [0, 255]이고 signed char는 [-127, 127 ].

이 표준을 사용하면 POD (일반 오래된 데이터)의 객체를 부호없는 char 배열로 직접 변환 할 수 있습니다. 이를 통해 객체의 표현과 비트 패턴을 검사 할 수 있습니다. char 또는 signed char에 대해 동일한 유형의 안전한 유형의 문장 보호가 존재하지 않습니다.

4
Julienne Walker

unsigned char는 양의 값만 취합니다 .... 0 - 255

어디로

signed char는 양수 값과 음수 값을 모두 취합니다 .... -128 ~ +127

4
munna

Unsigned char (부호없는) 바이트 값 (0에서 255)입니다. "캐릭터"라는 측면에서 "숯"을 생각할 수도 있지만 실제로는 수치입니다. 일반 "char"이 서명되어 있으므로 128 개의 값이 있으며이 값은 ASCII encoding을 사용하여 문자로 매핑됩니다. 그러나 두 경우 모두 메모리에 저장하는 값은 바이트 값입니다.

3
Zac Gochenour

특정 길이와 부호의 다양한 유형을 사용하고 싶다면 uint8_t, int8_t, uint16_t 등을 사용하는 것이 더 효과적 일 것입니다.

2
Dark Shikari

부호없는 char은 일반 char의 부호를 위해 예약 된 비트를 다른 숫자로 사용합니다. 이렇게하면 범위가 [-128 - 127]이 아닌 [0 - 255]로 변경됩니다.

서명하지 않으려는 경우 일반적으로 서명되지 않은 문자가 사용됩니다. char를 숫자로 사용하는 대신 char을 바이트로 처리 할 때 비트 이동 (시프트 확장) 및 기타 작업을 수행 할 때 차이가 있습니다.

2
JasonOfEarth

unsigned char는 모든 비트 속임의 핵심입니다. 모든 플랫폼 용 거의 모든 컴파일러에서 unsigned char는 단순히 BYTE입니다. 일반적으로 8 비트의 부호없는 정수입니다. 작은 정수 또는 비트 팩으로 처리 할 수 ​​있습니다.

중독에서 다른 사람이 말했듯이, 표준은 숯의 기호를 정의하지 않습니다. 그래서 당신은 char, signed char, unsigned char의 3 가지 "char"타입을 가지고 있습니다.

2
ugasoft

일부 인터넷 검색은 this 을 발견했습니다. 여기서 사람들은 이에 대해 토론했습니다.

부호없는 문자는 기본적으로 단일 바이트입니다. 따라서 1 바이트의 데이터가 필요한 경우이를 사용합니다 (예 : Windows API에서 자주 수행되는 것처럼 플래그를 사용하여 함수에 전달되도록 설정하는 등).

1
dbrien

부호없는 char은 양의 값만 취합니다 : 0에서 255 signed char는 양수 값과 음수 값을 취합니다. -128에서 +127까지

0
NL628

frome "c 프로그래밍 laugage"책 인용 :

한정자 signed 또는 unsigned은 char 또는 정수에 적용될 수 있습니다. 부호없는 숫자는 항상 양수 또는 0이며 modulo 2 ^ n의 법칙을 준수합니다. 여기서 n은 해당 유형의 비트 수입니다. 예를 들어 문자가 8 비트이면 부호없는 char 변수는 0에서 255 사이의 값을 가지며 부호있는 문자는 -128에서 127 사이의 값을 갖습니다 (2의 보수 시스템에서). 일반 문자가 부호가 있거나 서명이없는 것은 machine 의존적이지만 인쇄 가능한 문자는 항상 양수입니다.

0
ZhaoGang