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
'programing' 카테고리의 다른 글
뒤로 버튼을 클릭하면 크로스 브라우저 온로드 이벤트가 발생합니까? (0) | 2023.07.29 |
---|---|
자주 사용되는 PDO 행 수 (0) | 2023.07.29 |
jQuery AJAX를 사용한 PHP의 여러 반환 값 (0) | 2023.07.29 |
Float - FCM 온백그라운드 메시지 핸들러가 등록되지 않아 Dart에서 백그라운드 메시지를 처리할 수 없습니다. (0) | 2023.07.09 |
SQL Server의 임시 테이블로 인해 '이름이 지정된 개체가 이미 있습니다' 오류가 발생했습니다. (0) | 2023.07.09 |