programing

트랩 표현

prostudy 2022. 6. 4. 08:09
반응형

트랩 표현

  1. C의 '트랩 표현'이란 무엇입니까(일부 예는 도움이 될 수 있습니다).C++에도 해당되나요?

  2. 이 코드를 지정하면...

    float f=3.5;
    int *pi = (int*)&f;
    

    ...라고 가정하면...라고 가정하면sizeof(int) == sizeof(float), 삭제f ★★★★★★★★★★★★★★★★★」*pi이너패패패패패패?

  1. 트랩 표현은 C99(C89가 아닌 IIRC)가 사용하는 캐치 올 용어이며, 타입이 차지하는 공간에 적합한 비트 패턴을 나타내지만, 그 타입의 값으로 사용되는 경우는 정의되지 않은 동작을 트리거합니다.정의는 섹션 6.2.6.1p5(6.2.6 모두에 촉수가 있음)에 있습니다.여기서는 인용하지 않겠습니다.왜냐하면 길고 혼란스럽기 때문입니다.이러한 비트 패턴이 존재하는 타입은 트랩 표현을 「가져 있다.트랩 표현에는 타입이 필요 없습니다만, 표준 보증으로 트랩 표현이 없는 유일한 타입은 다음과 같습니다.unsigned char2..2 (6.2.6.1p5, 6.2.6.2p1)

    이 표준에서는 트랩 표현에 대한 두 가지 예를 제시합니다.이 중 어느 것도 실제 CPU가 수년간 실행한 것과 일치하지 않으므로 혼동하지 않습니다.트랩 표현의 좋은 예(또한 발생할 가능성이 높은 CPU 상의 하드웨어 레벨의 트랩 표현으로서 적격인 유일한 것)는 부동소수점 타입의 시그널링 NaN입니다.C99 Annex F(섹션 2.1)에서는 시그널링 NaN의 동작이 상세하게 규정되어 있는 경우에도 명시적으로 정의되어 있지 않습니다.

    포인터 타입에는 트랩 표현이 허용되지만 늘 포인터는 트랩 표현이 아닙니다.null 포인터는 참조되지 않거나 오프셋된 경우에만 정의되지 않은 동작을 일으킵니다.이 포인터에 대한 다른 작업(가장 중요한 것은 비교 및 복사)은 잘 정의되어 있습니다.트랩 표현은 트랩 표현이 있는 유형을 사용하여 읽기만 하면 정의되지 않은 동작을 일으킵니다.(유효하지만 늘이 아닌 포인터가 트랩 표현으로 간주되는지 여부는 논란의 대상입니다.CPU에서는 그렇게 취급하지 않지만 컴파일러에서는 그렇게 취급할 수 있습니다.)

  2. 표시된 코드에는 정의되지 않은 동작이 있지만 이는 트랩 표현 때문이 아니라 포인터 에일리어싱 규칙 때문입니다.합니다.floatint(당신이 말한 것처럼) 같은 표기를 가지고 있습니다.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항, 제7항).C99의 카피에는 테크니컬 corrigienda가 포함되어 있을 수 있습니다.기억에 따르면 원래 출판물에서는 정의되어 있지 않지만 TC에서는 지정되지 않은 것으로 변경되어 있습니다.

int 포인터를 사용하여 플로트에 별칭을 지정하는 정의되지 않은 동작입니다.

일반적으로 트랩 이외의 IEEE-754 부동소수점 값은 일부 플랫폼에서는 문제 없이 정수로 표시할 수 있습니다.그러나 모든 부동소수점 값에 고유한 정수 표현있다고 가정하고 FPU에 해당 값을 강제로 로드하면 예기치 않은 동작이 발생할 수 있습니다.

(http://www.dmh2000.com/cpp/dswap.shtml)에서 인용한 예)

예를 들어 FP 데이터를 사용하는 경우 엔디안성이 다른 CPU 간에 마셜링해야 하는 경우 다음과 같은 작업을 생각할 수 있습니다.

double swap(double)

불행히도 컴파일러가 입력을 FPU 레지스터에 로드하여 트랩 표현일 경우 FPU는 다른 비트 표현일 수 있는 동등한 트랩 표현으로 다시 쓸 수 있습니다.

즉, 올바르게 변환하지 않은 경우(정확하게 변환된 경우) 대응하는 비트 표현이 없는 FP 값이 있습니다.union,memcpy경유로char *또는 기타 표준 메커니즘).

언급URL : https://stackoverflow.com/questions/6725809/trap-representation

반응형