c++ - type - unsigned sign




char와 signed char의 차이점은 C++입니까? (2)

다음 코드를 살펴보십시오.

#include <iostream>
#include <type_traits>

int main(int argc, char* argv[])
{
    std::cout<<"std::is_same<int, int>::value = "<<std::is_same<int, int>::value<<std::endl;
    std::cout<<"std::is_same<int, signed int>::value = "<<std::is_same<int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<int, unsigned int>::value = "<<std::is_same<int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, int>::value = "<<std::is_same<signed int, int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, signed int>::value = "<<std::is_same<signed int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<signed int, unsigned int>::value = "<<std::is_same<signed int, unsigned int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, int>::value = "<<std::is_same<unsigned int, int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, signed int>::value = "<<std::is_same<unsigned int, signed int>::value<<std::endl;
    std::cout<<"std::is_same<unsigned int, unsigned int>::value = "<<std::is_same<unsigned int, unsigned int>::value<<std::endl;
    std::cout<<"----"<<std::endl;
    std::cout<<"std::is_same<char, char>::value = "<<std::is_same<char, char>::value<<std::endl;
    std::cout<<"std::is_same<char, signed char>::value = "<<std::is_same<char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<char, unsigned char>::value = "<<std::is_same<char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, char>::value = "<<std::is_same<signed char, char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, signed char>::value = "<<std::is_same<signed char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<signed char, unsigned char>::value = "<<std::is_same<signed char, unsigned char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, char>::value = "<<std::is_same<unsigned char, char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, signed char>::value = "<<std::is_same<unsigned char, signed char>::value<<std::endl;
    std::cout<<"std::is_same<unsigned char, unsigned char>::value = "<<std::is_same<unsigned char, unsigned char>::value<<std::endl;
    return 0;
}

결과는 다음과 같습니다.

std::is_same<int, int>::value = 1
std::is_same<int, signed int>::value = 1
std::is_same<int, unsigned int>::value = 0
std::is_same<signed int, int>::value = 1
std::is_same<signed int, signed int>::value = 1
std::is_same<signed int, unsigned int>::value = 0
std::is_same<unsigned int, int>::value = 0
std::is_same<unsigned int, signed int>::value = 0
std::is_same<unsigned int, unsigned int>::value = 1
----
std::is_same<char, char>::value = 1
std::is_same<char, signed char>::value = 0
std::is_same<char, unsigned char>::value = 0
std::is_same<signed char, char>::value = 0
std::is_same<signed char, signed char>::value = 1
std::is_same<signed char, unsigned char>::value = 0
std::is_same<unsigned char, char>::value = 0
std::is_same<unsigned char, signed char>::value = 0
std::is_same<unsigned char, unsigned char>::value = 1 

즉, intsigned intcharsigned char 아닌 같은 유형으로 간주됩니다. 왜 그런가요?

그리고 내가 charsigned char char 로 변환 할 수 있다면 make_signed 사용하여, 어떻게 반대의 방법으로 signed charchar 로 변환 할 수 있을까요?


그것은 의도적으로 C ++ 표준char , signed charunsigned char 이 다른 유형이라고 말합니다. 나는 당신이 변형을 위해 정적 캐스트를 사용할 수 있다고 생각한다.


사실, Standard는 char, signed char 및 unsigned char이 3 가지 다른 유형이라는 것을 정확하게 알려줍니다. char는 대개 8 비트이지만 이것은 표준에 의해 부과되지 않습니다. 8 비트 숫자는 256 개의 고유 값을 인코딩 할 수 있습니다. 차이점은 256 가지 고유 값이 해석되는 방식에만 있습니다. 8 비트 값을 부호있는 2 진 값으로 간주하면 -128 (코드화 된 80H)에서 +127까지의 정수 값을 나타낼 수 있습니다. 부호없는 문자는 0에서 255까지의 값을 나타낼 수 있습니다. C ++ 표준에 따라 부호있는 char은 -127에서 127 사이의 값 (-128이 아님)을 유지할 수 있지만 unsigned char은 값을 보유 할 수 있습니다 0 ~ 255.

char를 int로 변환 할 때 결과는 구현 정의됩니다! 결과는 단일 문자 'É'(ISO 8859-1)의 기계 구현에 따라 예를 들어 -55 또는 201 일 수 있습니다. 사실, 단어 (16 비트)로 char을 유지하는 CPU는 FFC9 또는 00C9 또는 C900 또는 C9FF (크고 작은 엔디안 표현)를 저장할 수 있습니다. signed 또는 unsigned char을 사용하면 char to int 변환 결과를 보장 할 수 있습니다.





typetraits