문제

C/C++에서는 unsigned char 에 사용됩니까?일반과 어떻게 다른가요? char?

도움이 되었습니까?

해결책

C++에는 세 가지가 있습니다. 별개의 문자 유형:

  • char
  • signed char
  • unsigned char

문자 유형을 사용하는 경우 텍스트, 자격이 없는 것을 사용하십시오 char:

  • 그것은 다음과 같은 문자 리터럴의 유형입니다. 'a' 또는 '0'.
  • C 문자열을 구성하는 유형입니다. "abcde"

숫자 값으로도 작동하지만 해당 값이 부호 있는 값으로 처리되는지 부호 없는 값으로 처리되는지는 지정되지 않습니다.불평등을 통한 문자 비교에 주의하십시오. 비록 ASCII(0-127)로 제한한다면 거의 안전할 것입니다.

문자 유형을 다음과 같이 사용하는 경우 숫자, 사용:

  • signed char, 이는 당신에게 적어도 -127~127 범위입니다.(-128~127이 공통)
  • unsigned char, 이는 당신에게 적어도 0~255 범위.

"적어도". C++ 표준은 각 숫자 유형이 처리해야 하는 최소 값 범위만 제공하기 때문입니다. sizeof (char) 1이어야 합니다(예:1바이트), 그러나 이론적으로 1바이트는 예를 들어 32비트일 수 있습니다. sizeof 여전히 크기를 다음과 같이 보고합니다. 1 - 당신이 의미하는 바는 ~할 수 있었다 가지다 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, 그렇지만.

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

내가 이 글을 게시한 이후 다른 사람들이 언급했듯이, int8_t 그리고 uint8_t 정말로 작은 정수를 표현하고 싶다면.

나는 그것이 정말로 필요하다고 느끼기 때문에 C와 C++의 몇 가지 규칙을 언급하고 싶습니다(이 점에서는 동일합니다).첫 번째, 모든 비트 ~의 unsigned char 서명되지 않은 char 객체가 있는 경우 값을 결정하는 데 참여합니다.두번째, unsigned char 명시적으로 서명되지 않은 것으로 명시되어 있습니다.

이제 값을 변환하면 어떤 일이 발생하는지 누군가와 논의했습니다. -1 int 유형 unsigned char.그는 결과가 나올 것이라는 생각을 거부했습니다. unsigned char 그는 기호 표현이 걱정되었기 때문에 모든 비트를 1로 설정했습니다.하지만 그는 그럴 필요가 없습니다.변환이 의도한 대로 수행되는 것은 이 규칙에 따라 즉시 수행됩니다.

새 유형이 서명되지 않은 경우 값이 새 유형의 범위에있을 때까지 새 유형으로 표시 될 수있는 최대 값보다 하나를 더 반복적으로 추가하거나 빼서 값이 변환됩니다.(6.3.1.3p2 C99 초안에서)

그것은 수학적 설명입니다.C++에서는 동일한 규칙을 적용하는 모듈로 미적분학(modulo calculus)으로 이를 설명합니다.어쨌든, 무엇입니까? ~ 아니다 보장되는 것은 정수의 모든 비트가 -1 변환 전의 것입니다.그렇다면 결과가 다음과 같다고 주장할 수 있는 것은 무엇입니까? unsigned char 모든 것을 가지고 있습니다 CHAR_BIT 비트가 1로 바뀌었나요?

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

실제로는 충분합니다!그러니 갖고 싶을 때마다 unsigned char 모든 부분을 하나로 가지고 있으면 그렇습니다.

unsigned char c = (unsigned char)-1;

또한 변환은 다음과 같습니다. ~ 아니다 단지 상위 비트를 자르는 것뿐입니다.을 위한 행운의 이벤트 2의 보수 그것은 단지 잘린 부분일 뿐이지만 다른 기호 표현에서도 반드시 그런 것은 아닙니다.

예를 들어 서명되지 않은 문자:

서명되지 않은 문자 항상은 아니지만 매우 자주 각 색상 구성 요소에 단일 바이트를 할당하는 컴퓨터 그래픽에서 자주 사용됩니다.일반적으로 RGB(또는 RGBA) 색상은 24(또는 32) 비트로 표시됩니다. 서명되지 않은 문자.부터 서명되지 않은 문자 값이 [0,255] 범위에 속하면 일반적으로 값은 다음과 같이 해석됩니다.

  • 0은 주어진 색상 구성 요소가 완전히 부족함을 의미합니다.
  • 255는 특정 색상 안료의 100%를 의미합니다.

따라서 RGB 빨간색은 (255,0,0) -> (100% 빨간색, 0% 녹색, 0% 파란색)이 됩니다.

왜 사용하지 않습니까? 서명된 문자?산술 및 비트 이동이 문제가 됩니다.이미 설명했듯이, 서명된 문자의 범위는 기본적으로 -128만큼 이동됩니다.RGB를 회색조로 변환하는 매우 간단하고 순진한(대부분 사용되지 않는) 방법은 세 가지 색상 구성 요소를 모두 평균하는 것입니다. 그러나 색상 구성 요소의 값이 음수인 경우 문제가 발생합니다.사용 시 빨간색(255, 0, 0)의 평균은 (85, 85, 85)입니다. 서명되지 않은 문자 산수.그러나 값이 서명된 문자s (127,-128,-128), 우리는 (-99, -99, -99)로 끝나고 이는 (29, 29, 29)가 됩니다. 서명되지 않은 문자 공간, 이는 잘못된 내용입니다.

문자를 작은 정수로 사용하려는 경우 가장 안전한 방법은 다음을 사용하는 것입니다. 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_MIN 그리고 CHAR_MAX 부호 없는 문자는 양수 끝에서 두 배의 범위를 제공합니다.예를 들어, CHAR_BIT 8, 일반 범위 char (서명되거나 서명되지 않을 수 있기 때문에) [0, 127]만 보장됩니다. unsigned char [0, 255]이고 signed char [-127, 127]이 됩니다.

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

unsigned char 양수 값만 취합니다. 0 에게 255

반면

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

부호 없는 char은 (부호 없는) 바이트 값(0~255)입니다."문자"라는 측면에서 "char"를 생각할 수도 있지만 실제로는 숫자 값입니다.일반 "char"는 부호가 있으므로 128개의 값이 있고 이러한 값은 ASCII 인코딩을 사용하여 문자에 매핑됩니다.그러나 두 경우 모두 메모리에 저장하는 것은 바이트 값입니다.

다양한 유형의 특정 길이와 부호를 사용하는 것을 좋아한다면 uint8_t, int8_t, uint16_t 등을 사용하는 것이 더 나을 것입니다. 단순히 말하는 대로 정확하게 수행하기 때문입니다.

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

일반적으로 서명되지 않은 문자는 서명을 원하지 않을 때 사용됩니다.이는 비트 이동(부호 확장 이동)과 char을 숫자로 사용하는 대신 바이트로 처리할 때와 같은 작업을 수행할 때 차이를 만듭니다.

서명되지 않은 문자는 모든 비트 속임수의 핵심입니다.모든 플랫폼의 거의 모든 컴파일러에서 부호 없는 문자는 단순히 BYTE입니다.(보통) 8비트의 부호 없는 정수입니다.작은 정수 또는 비트 팩으로 처리될 수 있습니다.

중독에서는 다른 사람이 말했듯이 표준이 문자의 표시를 정의하지 않습니다.따라서 3가지 고유한 "char" 유형이 있습니다.문자, 서명된 문자, 서명되지 않은 문자.

구글링 좀 해서 찾았다 이것, 사람들이 이것에 관해 토론을 벌였던 곳입니다.

unsigned char은 기본적으로 단일 바이트입니다.따라서 1바이트의 데이터가 필요한 경우 이 방법을 사용합니다. 예를 들어 Windows API에서 흔히 수행되는 것처럼 함수에 전달할 플래그를 설정하고 해제하는 데 이를 사용하려고 할 수 있습니다.

"C 프로그래밍 언어" 책에서 인용했습니다:

예선 signed 또는 unsigned char 또는 모든 정수에 적용될 수 있습니다.서명되지 않은 숫자는 항상 긍정적이거나 0이며, 산술 모듈로 2^n의 법칙에 순종합니다. 여기서 n은 유형의 비트 수입니다.예를 들어, chars가 8 비트 인 경우 서명되지 않은 char 변수는 0에서 255 사이의 값을 가지며, 서명 된 숯은 -128에서 127 사이의 값을 가지고 있습니다 (2 개의 보완 기계에서) 일반 숯이 서명되었는지 여부에 관계없이 서명하지 않은지. -의존적이지만 인쇄 가능한 문자는 항상 긍정적입니다.

unsigned char은 양수 값만 취합니다.0 ~ 255 서명 된 char는 긍정적이고 음수 값을 가져옵니다.-128 ~ +127

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