>  기사  >  백엔드 개발  >  `char`, `signed char`, `unsigned char`은 C에서 정말 구별됩니까?

`char`, `signed char`, `unsigned char`은 C에서 정말 구별됩니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 04:22:31421검색

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

C의 문자 유형: 고유하거나 동등한가?

C에서 문자 유형(char)의 동작은 때때로 C의 동작과 다를 수 있습니다. 부호 있는 정수와 부호 없는 정수로 인해 혼란이 발생합니다. 특히 다음 코드는 이러한 차이점을 보여줍니다.

<code class="cpp">#include <iostream>

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

template <typename T>
struct isX
{
   typedef typename T::ikIsX ikIsX;
};

template <>            struct isX<char  >  { typedef FalseType ikIsX; };
template <>            struct isX<int8  >  { typedef FalseType ikIsX; };
template <>            struct isX<uint8 >  { typedef FalseType ikIsX; };

template <typename T> bool getIsTrue();
template <>           bool getIsTrue<TrueType>() { return true; }
template <>           bool getIsTrue<FalseType>() { return false; }

int main(int, char **t )
{
   cout << getIsTrue< isX<char>::ikIsX  >() << endl;
   cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
}</code>

이 코드는 컴파일되지만 char에 대해서는 int8 및 uint8과 다른 결과를 생성합니다. 이는 C가 char, signed char 및 unsigned char를 서로 다른 세 가지 유형으로 취급하기 때문입니다.

반면에 int와 uint32는 동등한 유형입니다.

<code class="cpp">template <>            struct isX<int   >  { typedef FalseType ikIsX; };
template <>            struct isX<unit32>  { typedef FalseType ikIsX; };</code>

이러한 구별은 다음과 같은 사실에서 비롯됩니다. char은 역사적으로 문자를 표현하고 숫자 값을 저장하는 데 사용되었습니다. 결과적으로 C는 일반 char를 int와 구별되는 별도의 유형으로 처리하여 이전 버전과의 호환성을 유지합니다.

char가 사용하는 두 가지 표현 중 무엇을 사용하는지 확인하기 위해 구현에 정의된 typedef char_traits::signed는 다음과 같습니다. 제공됩니다. 이것이 true이면 char은 부호 있는 유형으로 작동합니다. 그렇지 않으면 부호 없는 유형으로 작동합니다.

위 내용은 `char`, `signed char`, `unsigned char`은 C에서 정말 구별됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.