programing

C/C++에서 주조된 유형은 정확히 무엇입니까?

procenter 2023. 7. 29. 13:15
반응형

C/C++에서 주조된 유형은 정확히 무엇입니까?

C/C++에서 주조된 유형은 정확히 무엇입니까?컴파일러는 명시적인 타입캐스트가 필요한지(그리고 유효한지) 어떻게 확인합니까?값에 필요한 공간을 비교합니까?예를 들면 다음과 같습니다.

int a;
double b = 15.0;
a = (int) b;

내 기억이 맞다면 이중 값은 더 많은 공간을 필요로 합니다(8바이트였습니까?!)는 정수(4바이트)보다 큽니다.그리고 두 가지의 내부 표현은 완전히 다릅니다(2개/맨티사에 대한 보완).그러면 내부적으로 무슨 일이 일어날까요?여기서의 예는 매우 간단하지만 C/C++에는 풍부한 유형 캐스트가 있습니다.

예를 들어 FOO를 BAR에 캐스팅할 수 있는지 컴파일러가 어떻게 알 수 있습니까?

유형 캐스트는 기본적으로 한 유형에서 다른 유형으로 변환됩니다.이는 암묵적일 수 있습니다(즉, 컴파일러에 의해 자동으로 수행되며 프로세스에서 정보가 손실될 수 있습니다). 또는 명시적일 수 있습니다(즉, 코드에서 개발자에 의해 지정됨).유형이 차지하는 공간은 부차적으로 중요합니다.더 중요한 것은 변환의 적용 가능성(때로는 편리함)입니다.

암시적 변환으로 정보가 손실될 수 있고, 부호가 손실/취득될 수 있으며, 오버플로/언더플로가 발생할 수 있습니다.컴파일러는 컴파일 시 생성되는 경고를 제외하고 이러한 이벤트로부터 사용자를 보호하지 않습니다.파생 유형이 기본 유형(값 기준)으로 암시적으로 변환되는 경우에도 슬라이싱이 발생할 수 있습니다.

완전히 위험할 수 있는 변환(예: 기본에서 파생된 유형으로)의 경우 C++ 표준은 명시적인 캐스트를 요구합니다.뿐만 아니라 다음과 같은 보다 제한적인 명시적 캐스팅을 제공합니다.static_cast,dynamic_cast,reinterpret_cast,그리고.const_cast각각의 경우 명시적 주조를 가능한 변환의 하위 집합으로만 제한하여 주조 오류의 가능성을 줄입니다.

C++에서 개발자는 생성자와 오버로드된 (캐스트) 연산자를 사용하여 사용자 정의 유형(예: 암시적 및 명시적)에 대한 변환을 확장할 수 있지만, 암시적 및 명시적 변환은 궁극적으로 C/C++ 표준에 의해 정의됩니다.

캐스팅이 표준에 의해 허용되고 그렇지 않은 완전한 규칙은 상당히 복잡해질 수 있습니다.저는 이 답변에서 그 규칙들 중 일부에 대한 다소 간결한 요약을 충실히 제시하려고 노력했습니다.만약 당신이 무엇이 허용되고 무엇이 허용되지 않는지에 대해 진심으로 관심이 있다면, 나는 당신이 표준을 방문하여 유형 변환에 대한 각 섹션을 읽을 것을 강력히 권고합니다.

자주 간과되는 사항을 언급하고 싶습니다.

  • 캐스트는 항상 대상 유형의 임시를 만듭니다(대상 유형이 참조인 경우에는 알 수 없음).

이것은 중요할 수 있습니다.예:

#include <iostream>

void change_one_print_other( int& a, const int& b )
{
    a = 0;
    std::cout << b << "\n";
}

int main(void)
{
    int x = 5, y = 5;

    change_one_print_other(x, x);
    change_one_print_other(y, static_cast<int>(y));
}

저 깁스는 쓸모가 없어 보입니다.하지만 외모는 속일있습니다.

컴파일러가 암묵적으로 수행하는 방법을 알고 있는 특정 유형 캐스트가 있습니다. 이중으로 int가 그 중 하나입니다.그것은 단지 소수점 부분을 떨어뜨립니다.내부 표현은 프로세스의 일부로 변환되어 할당이 올바르게 작동합니다.

값이 너무 커서 제대로 변환할 수 없습니다.저는 그 경우에 대한 규칙이 무엇인지 기억이 나지 않습니다. 컴파일러의 재량에 맡길 수 있습니다.

코드의 작은 C 프로그램을 만들고 GCC가 어셈블리 코드를 생성하도록 하는 방법의 지침을 따라 컴파일러가 유형 캐스트를 수행하는 방법을 확인합니다.

언급URL : https://stackoverflow.com/questions/7558837/what-exactly-is-a-type-cast-in-c-c

반응형