트랩 표현
C에서 "트랩 표현"이란 무엇입니까 (일부 예제가 도움이 될 수 있음)? C ++에도 적용됩니까?
이 코드가 주어지면 ...
float f=3.5; int *pi = (int*)&f;
... 그리고 그 가정
sizeof(int) == sizeof(float)
수행f
과*pi
같은 이진 표현 / 패턴이 있습니까?
트랩 표현은 유형이 차지하는 공간에 맞는 비트 패턴을 설명하기 위해 C99 (C89가 아닌 IIRC)에서 사용하는 포괄적 인 용어이지만 해당 유형의 값으로 사용되는 경우 정의되지 않은 동작을 트리거합니다. 정의는 섹션 6.2.6.1p5 (6.2.6 모두에 촉수 포함)에 있으며 길고 헷갈 리기 때문에 여기서 인용하지 않겠습니다. 그러한 비트 패턴이 존재하는 유형은 트랩 표현을 "가짐"이라고합니다. 트랩 표현을 갖는 데 필요한 유형은 없지만 표준에서 보장하는 트랩 표현이 없는 유일한 유형 은
unsigned char
(6.2.6.1p5, 6.2.6.2p1)입니다.표준은 트랩 표현에 대한 두 가지 가상의 예를 제공합니다. 두 가지 모두 실제 CPU가 수년 동안 수행 한 것과 일치하지 않으므로 혼동하지 않을 것입니다. 트랩 표현 의 좋은 예 (또한 만날 가능성이있는 모든 CPU에서 하드웨어 수준 트랩 표현으로 자격이되는 유일한 것)은 부동 소수점 유형의 신호 NaN입니다. C99 Annex F (섹션 2.1)는 IEC 60559가 동작을 자세히 지정하더라도 NaN 신호의 동작을 명시 적으로 정의하지 않습니다.
포인터 유형 이 트랩 표현을 가질 수 있지만 널 포인터는 트랩 표현 이 아니라는 점을 언급 할 가치가 있습니다. Null 포인터는 역 참조되거나 오프셋 된 경우에만 정의되지 않은 동작을 유발합니다. 그들에 대한 다른 작업 (가장 중요한 것은 비교 및 복사)이 잘 정의되어 있습니다. 트랩 표현은 트랩 표현이 있는 유형을 사용하여 읽기만 하면 정의되지 않은 동작을 유발 합니다. ( 유효하지 않지만 null이 아닌 포인터가 트랩 표현인지 고려되어야 하는지 여부 는 논쟁의 대상입니다. CPU는 이러한 포인터를 처리하지 않지만 컴파일러는 처리 할 수 있습니다.)
표시되는 코드에는 정의되지 않은 동작이 있지만 이는 트랩 표현이 아니라 포인터 앨리어싱 규칙 때문입니다. 이것은 변환하는 방법입니다
float
에int
(, 당신이 말한대로, 가정 같은 표현으로sizeof(float) == sizeof(int)
)int extract_int(float f) { union { int i; float f; } u; u.f = f; return u.i; }
이 코드가 지정되지 않은 기본적으로 정의하지 않는 표준을 의미 C99에 (정의되지 않음) 동작 값의 정수 무엇 생산을,하지만 당신은 어떻게해야합니까 일부 , 그것은, 트랩 표현이 아니다 유효한 정수 값을 컴파일러가 최적화에 허용되지 않습니다 당신이 이것을하지 않았다는 가정하에. (제 6.2.6.1는 C99의 내 사본 파라 7. 기술 corrigienda를 포함 할 수 있습니다 - 내 기억이가 있다는 것입니다 된 해당 출판물에서 정의되지 않은 있지만 TC에 지정되지 않은 변경되었습니다.)
정수 포인터를 사용하여 부동 소수점의 별칭을 지정하는 정의되지 않은 동작입니다.
일반적으로 트랩이 아닌 IEEE-754 부동 소수점 값은 문제없이 일부 플랫폼에서 정수로 표시 될 수 있습니다. 그러나 가정하면 예기치 않은 동작이 발생할 수 있습니다 부동 소수점 값이있는 모든 부동 소수점 값은 고유 한 정수 표현을 하고 그 값을로드하기 위해 FPU를 강제하는 일이.
( http://www.dmh2000.com/cpp/dswap.shtml 에서 가져온 예 )
예를 들어 FP 데이터로 작업 할 때 엔디안이 다른 CPU간에 마샬링해야하는 경우 다음을 수행 할 수 있습니다.
double swap(double)
불행히도 컴파일러가 입력을 FPU 레지스터로로드하고 트랩 표현 인 경우 FPU는 다른 비트 표현 인 동등한 트랩 표현으로 다시 쓸 수 있습니다.
즉, 올바르게 변환하지 않으면 해당 비트 표현이없는 일부 FP 값이 있습니다 (정확하게 union
, memcpy
via char *
또는 기타 표준 메커니즘을 통해 의미 함 ).
참고 URL : https://stackoverflow.com/questions/6725809/trap-representation
'Programing' 카테고리의 다른 글
Xcode 6 iPhone 시뮬레이터 용 iOS 8 UITableView에서 SeparatorInset 제거 (0) | 2020.11.29 |
---|---|
AndroidJUnit4 및 ActivityTestRule을 단위 테스트 클래스로 가져올 수없는 이유는 무엇입니까? (0) | 2020.11.29 |
Ruby on Rails 전문가가 Scaffolding을 사용하지 않는 이유는 무엇입니까? (0) | 2020.11.28 |
SHA-1 커밋 객체에 대한 정보를 얻습니까? (0) | 2020.11.28 |
PHP에서 특정 유형의 객체를 확인하는 방법 (0) | 2020.11.28 |